C语言中全局数组和局部数组的问题

 今天同学遇到一个在C语言中全局数组和局部数组的问题,卡了许久,我也没有第一时间看出问题,现在把问题梳理一下,并给出解决方案。

  问题描述:

  在全局声明的数组与在局部声明的数组有着不同的效果。

  首先来看一个程序:

  代码如下:

  #include <stdio.h>

  #include <stdlib.h>

  #define MAX 10

  char a[MAX];

  int main()

  {

  int i;

  char b[MAX];

  char *c=(char *)malloc(MAX * sizeof(char));

  printf(" Array a: ");

  for(i=0;i<MAX;i++)

  printf("%d ",a[i]);

  printf(" Array b: ");

  for(i=0;i<MAX;i++)

  printf("%d ",b[i]);

  printf(" Array c: ");

  for(i=0;i<MAX;i++)

  printf("%d ",c[i]);

  printf(" Done");

  free(c);

  return 1;

  }

  编译运行结果:

  

  程序主要功能是打印字符数组的Ascii码。可以发现全局数组a和动态生成的数组c有着相同的结果,而局部声明的数组b确被分配了随机的数值,也许这就是问题的所在。

  解决方案:

  代码如下:

  #include <stdio.h>

  #include <stdlib.h>

  #define MAX 10

  char a[MAX]={0};

  int main()

  {

  int i;

  char b[MAX]={0};

  char *c=(char *)malloc(MAX * sizeof(char));

  printf(" Array a: ");

  for(i=0;i<MAX;i++)

  printf("%d ",a[i]);

  printf(" Array b: ");

  for(i=0;i<MAX;i++)

  printf("%d ",b[i]);

  printf(" Array c: ");

  for(i=0;i<MAX;i++)

  printf("%d ",c[i]);

  printf(" Done");

  free(c);

  return 1;

  }

  运行结果:

  

  在数组的初始化中,假设初始化的数值个数小于数组的大小,则全部用0来填充。这里通过初始化一个值,就可以给数组一个确定的结果。

  (在不同系统和不同的编译器可能会出现不同的结果)

  还有一个小问题就是C语言中空格的问题,看下面的程序。

  代码如下:

  #include <stdio.h>

  #include <stdlib.h>

  #define MAX 10

  int main()

  {

  int i;

  char b[MAX]={0};

  gets(b);

  printf(" Array b: ");

  for(i=0;i<MAX;i++)

  printf("%d ",b[i]);

  printf(" Done");

  return 1;

  }

  

  在这里,我输入了" int"(三个空格+int),打印的结果如上图。

  b中前三个记录了空格的Ascii码,即32。

  b中后面没有使用的空间依然是0.

时间: 2025-01-20 10:22:11

C语言中全局数组和局部数组的问题的相关文章

C语言中全局数组和局部数组的问题_C 语言

今天同学遇到一个在C语言中全局数组和局部数组的问题,卡了许久,我也没有第一时间看出问题,现在把问题梳理一下,并给出解决方案. 问题描述: 在全局声明的数组与在局部声明的数组有着不同的效果. 首先来看一个程序: 复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #define MAX 10 char a[MAX]; int main() { int i; char b[MAX]; char *c=(char *)malloc(MAX

c语言中向二维字符数组中写入符号*

问题描述 c语言中向二维字符数组中写入符号* 声明一个二维字符数组char str[][]: 通过循环嵌套向里面写入符号 * 怎么实现?求前辈指教. 解决方案 for (int i = 0; i < 100; i++) { arr[i / 10][u % 10] = ' '; } for (i =0; i < 10; i++) { arr[3][i] = '*'; arr[4][i] = '*'; arr[i][3] = '*'; arr[i][4] = '*'; } 解决方案二: 只要一行

C语言中实现动态分配二维数组

在C语言中动态的一维数组是通过malloc动态分配空间来实现的,动态的二维数组也可以通过malloc动态分配空间来实现. 实际上,C语言中没有二维数组,至少对二维数组没有直接的支持,取而代之的是"数组的数组",二维数组可以看成是由指向数组的指针构成的数组.对于一个二维数组p[i][j],编译器通过公式*(*(p+i)+j)求出数组元素的值: 1.p+i 计算行指针. 2.*(P+i) 具体的行,是一个指针,指向该行首元素地址. 3.*(P+i)+j 得到具体元素的地址. 4.*(*(p

c-C语言中函数数组调用问题

问题描述 C语言中函数数组调用问题 5C 定义的二维数组为全局变量,在主函数中有多个子函数要用到它.请问下大家,子函数中计算的此二维数组的值间能传递么?还是也需要调用呢?~~ 解决方案 可以传引用或者指针,或者定义为全局变量.那就直接用不用传了. 解决方案二: 传递数组地址或指针,C中没有引用 解决方案三: 你用全局变量,每个函数里面都可以改啊. 解决方案四: 全局的直接访问就行了,就是要注意不要把里面的数据乱改,导致读取出问题 解决方案五: 你使用全局变量,每个函数都可以去访问它并且修改它,会

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求

c语言中怎么把一个大小不确定的二维数组当作参数传入函数中

问题描述 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中,取大神,取大神,取大神 解决方案 用VC++新建一个程序,默认生成的main函数定义如下 int mian(int argc, char* args[]) 这就是一个例子. 解决方案二: 一个表示长度的参数,一个指向二维数组的指针 解决方案三: fun(args[][],int rows,int cols) 解决方案四: void Func(int array[][10]

再谈C语言中数组和指针之间的互操作

我曾说过,在C语言中只有一维的数组(这是我对数组的看法),而且数组元素可以是任何类型的数据(或对象),自然也可以是另外的一个数组(因为数组也是一种数据类型).所以如果你坚持要说有多维数组,那也不是不可能的事情.我们只要把一个数组赋值给另一个数组的元素就可以了.当然了,我们必须保证在程序编译期数组的大小是一个固定的常数. 其实,数组的操作很简单的.只要我们确定一个数组的大小和指向该数组下标为0的元素的指针,其他的任何一个数组下标的运算都等同于一个对应的指针运算,所以我们说"数组和指针是可以相互操作

浅议C语言中数组和指针的互操作

曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减. 当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有必要知道其中的基本的数据结构的比如数组,稍微有点深度的堆栈.列表.结构体等的操作和实现.指针也是C语言中的一个很优秀灵活的结构,对它的了解也是必不可少的. 我们一般都认为数组是一维的数据存储结构,因为二位数组或者说矩阵都可以看作是多个一维数组的组合结构,定义在其上的数据存储访问方式

Java语言入门教程(十一):Java语言中的数组

在教程(十)中,我们学习了Java类之间常见的两种关系,即关联和依赖. 如果A关联或依赖B,如果仅从A到B这个方向看,从数量上,可能有1对1和1对多 两种可能.面向对象的应用,都是映射现实世界的对象以及对象之间的关系的, 仔细考察一下我们身边的情况,对象与对象之间如果存在关联或依赖,其实1对 多的关系更为常见.如,一个部门有多个员工,一个学员有多个院系,一个人有 多张毕业证书- 上篇文章中的例子,学生只能选择一门免费课程学习,如果培训中心加大优 惠力度,每个学生最多可以选择3门课程学习,应该如何