当给多个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吧