您的位置:首页 > 其它

指针和数组错用的问题汇总

2013-02-22 23:37 176 查看
指针和数组名容易用错,本文记录常见的错误。

错误用法一、定义时是数组,在其他文件中声明为指针。

file a.c 中,定义b是一个数值:

#include <stdio.h>

char b[4] = {'1', '2', '3', '4'};

void printinfilea(void)
{
printf("in a.c, b=0x%x, first addr=0x%x \n", b, &b[0]);

return;
}


文件 b.c 中声明b为指针:

#include <stdio.h>

extern char *b;

void printinfileb(void)
{
printf("in b.c, b=0x%x \n", b);

return;
}


文件 main.c

#include <stdio.h>

int main()
{
printinfilea();
printinfileb();

return 0;
}


在cygwin中运行结果如下:

h@he-c9c1ddb921eb ~/test/ptr-array
$ gcc -mbig -o test a.c b.c main.c
$ ./test
in a.c, b=0x402000, first addr=0x402000
in b.c, b=0x34333231

总结一下:

在a.c中定义的数组,其数组名(b)只是一个名字,不占用物理的内存区域,只是编译、运行时代表数组的起始地址;

而在b.c中认为b是一个全局变量,指针类型的全局变量,所以,打印b的值,就是打印指针变量中存储的值,所以,就是字符'1','2','3','4'组成的数字。

其实,如果在b.c中打印 &b的值(printf("in b.c, b=0x%x &b=0x%x\n", b, &b);),得到的数值也是0x402000, 如下:

h@he-c9c1ddb921eb ~/test/ptr-array
$ ./test
in a.c, b=0x402000, first addr=0x402000
in b.c, b=0x34333231 &b=0x402000

问题解决、规避方法:

在头文件 a.h 中对外声明 extern char b[], 其他源文件,凡是需要使用b的,只能包含头文件a.h ,不允许显式的extern ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: