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 * sizeof(char));
printf("\nArray a:\n");
for(i=0;i<MAX;i++)
printf("%d ",a[i]);

printf("\nArray b:\n");
for(i=0;i<MAX;i++)
printf("%d ",b[i]);

printf("\nArray c:\n");
for(i=0;i<MAX;i++)
printf("%d ",c[i]);
printf("\nDone");
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("\nArray a:\n");
for(i=0;i<MAX;i++)
printf("%d ",a[i]);

printf("\nArray b:\n");
for(i=0;i<MAX;i++)
printf("%d ",b[i]);

printf("\nArray c:\n");
for(i=0;i<MAX;i++)
printf("%d ",c[i]);
printf("\nDone");
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("\nArray b:\n");
for(i=0;i<MAX;i++)
printf("%d ",b[i]);
printf("\nDone");
return 1;
}

 
在这里,我输入了" int"(三个空格+int),打印的结果如上图。
b中前三个记录了空格的Ascii码,即32。
b中后面没有使用的空间依然是0.
打完收工。

时间: 2024-09-16 21:42:58

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

对C语言中指针的理解与其基础使用实例_C 语言

C语言的指针,关键意思在于"指". "指"是什么意思? 其实完全可以理解为指示的意思.比如,有一个物体,我们称之为A.正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流.将一个物体的指示,是对这个物体的抽象.有了这种抽象能力,才有所谓的智慧和文明.所以这就是"指示"这种抽象方法的威力. 退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示.这是指示,也就是这段数据/指令的起始

C语言中的结构体的入门学习教程_C 语言

C语言中数组允许定义类型的变量,可容纳相同类型的多个数据项,但结构体在C语言编程中,它允许定义不同种类的数据项可供其他用户定义的数据类型. 结构是用来代表一个记录,假设要跟踪图书馆的书籍.可能要跟踪有关每本书以下属性: Title - 标题 Author - 作者 Subject - 科目 Book ID - 编号 定义结构体定义一个结构体,必须使用结构体的struct语句.该struct语句定义了一个新的数据类型,程序不止一个成员.struct语句的格式是这样的: struct [struct

详解C语言中的符号常量、变量与算术表达式_C 语言

C语言中的符号常量在结束讨论温度转换程序前,我们再来看一下符号常量.在程序中使用 300.20 等类似的"幻数"并不是一个好习惯,它们几乎无法向以后阅读该程序的人提供什么信息,而且使程序的修改变得更加困难.处理这种幻数的一种方法是赋予它们有意义的名字.#define 指令可以把符号名(或称为符号常量)定义为一个特定的字符串: #define 名字 替换文本 在该定义之后,程序中出现的所有在 #define 中定义的名字(既没有用引号引起来,也不是其它名字的一部分)都将用相应的替换文本替

新手小心:c语言中强符号与弱符号的使用_C 语言

声明:下面的实例全部在linux下尝试,window下未尝试.有兴趣者可以试一下.文章针c初学者.c语言的强符号和弱符号是c初学者经常容易犯错的地方.而且很多时候,特别是多人配合开发的程序,它引起的问题往往非常行为怪异而且难以定位.什么是强符号和弱符号?在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量时弱符号.强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号:如果一个强符号和一个弱符号,这选择强符号:如果多个弱符号,则任意选一个.它的陷阱:上代码:

详解C语言中结构体的自引用和相互引用_C 语言

结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针. 结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针.1. 自引用 结构体 1.1 不使用typedef时错误的方式: struct tag_1{ struct tag_1 A; /* 结构体 */ int value; };         这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去

C语言中操作密码文件的一些函数总结_C 语言

C语言setpwent()函数:从头读取密码文件中的账号数据 头文件: #include <pwd.h> #include <sys/types.h> 定义函数: void setpwent(void); 函数说明:setpwent()用来将getpwent()的读写地址指回密码文件开头. 范例 #include <pwd.h> #include <sys/types.h> main() { struct passwd *user; int i; for(i

详解C++语言中的加法运算符与赋值运算符的用法_C 语言

加法运算符:+ 和 -语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.

简单了解C语言中直接插入排序与直接选择排序实现_C 语言

直接插入排序基本思路: 1. 从a[0]开始,也就是从1个元素开始是有序的,a[1]~a[n-1]是无序的. 2. 从a[1]开始并入前面有序的数组,直到n-1. #include <stdio.h> #define N 5 void insertsort(int a[], int n); void swap(int *x, int *y); void insertsort(int a[], int n){ int i,j; for(i=1; i<n; i++){ for(j=i; j&

C语言中的内存泄露 怎样避免与检测_C 语言

有些程序并不需要管理它们的动态内存的使用.当需要内存时,它们简单地通过分配来获得,从来不用担心如何释放它.这类程序包括编译器和其他一些运行一段固定的(或有限的)时间然后终止的程序.当这种类型的程序终止时,所有内存会被自动回收.细心查验每块内存是否需要回收纯属浪费时间,因为它们不会再被使用. 其他程序的生存时间要长一点.有些工具如日历管理器.邮件工具以及操作系统本事经常需要数日及至数周连续运行,并需要管理动态内存的分配和回收.由于C语言通常并不使用垃圾回收器(自动确认并回收不再使用的内存块),这些

C语言中返回错误信息的相关函数用法总结_C 语言

C语言strerror()函数:返回错误原因的描述字符串头文件: #include <string.h> 定义函数: char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回. 返回值:返回描述错误原因的字符串指针. 范例: /* 显示错误代码0 至9 的错误原因描述 */ #include <string.h> main() { int i; for(i = 0