为何两个C++指针数组输出的内存地址不同?
问题解释:两个数组地址不同的原因
你混淆了数组自身的地址和数组元素指向的字符串地址,这是两个完全不同的概念:
s和s1是两个独立的栈变量const char *s[]和char *s1[]是在main函数栈帧里声明的两个不同数组变量,编译器会为它们分配各自独立的栈内存空间,所以它们的起始地址(也就是你直接cout << s和cout << s1输出的内容)必然不同。你看到的0x6ffde0和0x6ffdb0就是这两个数组在栈上的起始位置。数组元素指向的是同一个字符串字面量
字符串字面量(比如"flower")会被编译器放在程序的只读数据段,而且相同内容的字符串字面量会被合并成一个实例节省空间。所以不管是用const char*指向它,还是强制转成char*指向它,最终指向的都是同一个只读内存地址,这就是你测试"flower"和(char*)"flower"地址一致的原因。
验证方法
如果输出数组里的元素地址,你会发现对应位置的指针指向的是同一个字符串:
cout << (void*)s[0] << endl; // 和下面的输出相同 cout << (void*)s1[0] << endl;
内容的提问来源于stack exchange,提问作者Mark_Phys
相关产品推荐
相关产品推荐

