首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

当给多个char指针赋初值的时候.解决方法

2012-03-23 
当给多个char指针赋初值的时候...运行一下下面的代码#includestdio.hintmain(void){charstr1[]abc c

当给多个char指针赋初值的时候...
运行一下下面的代码
#include   <stdio.h>

int   main(void)
{
char   str1[]=   "abc ";
char   str2[]=   "abc ";
char   *str3=   "abc ";
char   *str4=   "abc ";
const   char   str5[]=   "abc ";  
const   char   str6[]=   "abc ";  
const   char*   str7=   "abc ";
const   char*   str8=   "abc ";

printf( "%d\n ",   (   str1==str2   ));
printf( "%d\n ",   (   str3==str4   ));
printf( "%d\n ",   (   str5==str6   ));
printf( "%d\n ",   (   str7==str8   ));
printf( "%d\n ",   (   str3==str7   ));

return   0;
}

结果是
0
1
0
1
1
无论是用C还是C++,或者VC++、亦或是GCC。结果都是这样。

我们知道直接比较指针的值,则比较的是它们指向的地址值。
而上面的结果,很明显说明str3、str4、str7、str8这四个变量指向了同一个地址。
而如果,把这四个字符串的内容改成不同,则它们就又不相同了。

是不是编译器在处理常量时,把所有相同的量只保存了一次,来节省程序所花的空间?

有没有这方面的资料可以提供?也不知道这是编译器自己的原因还是ANSI就这么规定的。至少我还没在《ANSI   C标准详解》这本书上找到它的解释。
请高手们指点一下。谢谢!

[解决办法]
对于char型的数组 ,每一个数组是申请一段空间,然后将abc拷贝到里面
所以每个数组的首地址是不一样的

而对于char型的指针,因为 "abc "是字符串常量,所以将char型指针指向 "abc ",那么char指针的地址是确定的,也就是字符串常量 "abc "在内存中的地址
[解决办法]
str1, str2, str5, str6的值不同,那是应该它们是在栈中自动分配的字符数组,用后面的字符常量初始化。
标准没规定相同常量只保存一次,不过编译器实现的时候大多只保存一个,应该你也不能在程序中改变常量的值,它永远保持常量,就保存一个很省空间
[解决办法]
这个是这样的
char *str = " "; 这种类型编译器是会进行优化的
所有的相同的字符只会存一份,为什么呢? 因为这种方式申请是const char* 里面数据是不可被更改的,只能读

而char str[]这种定义方式,是给str分配了空间,将字符串拷贝进去,每个这样定义的数据地址都会不同.
[解决办法]
这样看:
数组是被分配了连续的内存空间,只是存储的数据一样,所以地址值肯定是不同的。

而指针指向的都是同一个地址即数组“abc”的地址。
[解决办法]
是不是编译器在处理常量时,把所有相同的量只保存了一次,来节省程序所花的空间?

通常编译器这么做,但没有标准规定必须这么做,所以别写出依赖这个的代码。
[解决办法]
应该是编译器优化的,在编译是,发现有相同的常量字符串,就给优化成同一个了.
[解决办法]
好象大家都没有实践过吧,我把你的程序运行了下,结果都是0,也是我认为的正常结果,定义了一个指针并初始化后,系统就分配一段空间给他,而并不是像大家所想的那样优化空间就分配同一段空间,那肯定是错误的,因为定义的指针是不一样的,知识里面的内容一样而已,指针是不同的,大家再试试运行下看看。。
[解决办法]
楼上的是什么编译器啊

我用VC6.0的结果是和楼主一样 不可能全都是0吧

热点排行