期初觉得理解了指针数组了,但是偶然间发现指针数组元素所指向的字符串占用1byte内存,很不理解!下边贴图
还有,本人分别用VC6.0和VS20102测试,发现这两个编译器对内存的分配有截然不容的结果。
区别有:
1)内存模型不同,指针数组元素所指的字符串都存在常量区,但是存放的地址一个升序一个降序
2)内个字符串占内存大小不一样,从下边图片可见。
求指导!
VS2012下
还有,本人分别用VC6.0和VS20102测试,发现这两个编译器对内存的分配有截然不容的结果。
区别有:
1)内存模型不同,指针数组元素所指的字符串都存在常量区,但是存放的地址一个升序一个降序
2)内个字符串占内存大小不一样,从下边图片可见。
求指导!
VS2012下
void main() { int i = 0; char** pArray3 = NULL; int nArray3Num = 0; int a = 0; //指针数组 char* array1[] = {"bbbb", "aaaa", "cccc", "2222", "1111", "4444"}; //二维数组 char array2[10][30] = {"zzz", "yyyy", "33333"}; a = sizeof(“bbbb”); printf("%d \n", a ); for ( i = 0; i < 6; i++) { printf("%s %d\n", array1[i], array1[i] ); } }
VC6.0下
void main() { int i = 0; char** pArray3 = NULL; int nArray3Num = 0; int a = 0; //指针数组 char* array1[] = {"bbbb", "aaaa", "cccc", "2222", "1111", "4444"}; //二维数组 char array2[10][30] = {"zzz", "yyyy", "33333"}; //这里赋值一共三行 每一个"字符串"表示一行 a = sizeof("bbbb"); printf("%d \n", a ); for ( i = 0; i < 6; i++) { printf("%s %d\n", array1[i], array1[i] ); } system("pause"); }
解决方案
4
lz的结果呢,莫非让我们去下个vc6.0再跑这个段代码?
24
标准并没有规定要升序还是降序,所以怎样都是可以的。
字符串占内存大小不一样,用 objdump 查看一下就都清楚了.
字符串占内存大小不一样,用 objdump 查看一下就都清楚了.
12
不要企图依赖输出指针相关表达式…的值【例如printf(“%p\n”,…);或cout<<…】来理解指针的本质,
而要依赖调试时的反汇编窗口中的C/C++代码【例如void *p=(void *)(…);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
而要依赖调试时的反汇编窗口中的C/C++代码【例如void *p=(void *)(…);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
12
二者输出结果还是基本一致的,
VC6 应用程序基址 是0x400000
VS2012 基址为 0x17XXXXXXXX… 大约是这样,未必准确,未必一致
VS2012每个字符串占18字节(0x12) ()(每个字符串(数组),两边各加若干字节用于调试)
VC6 每个字符串占22字节 (0x16)
只是VS2012更加节约一点
VC6 应用程序基址 是0x400000
VS2012 基址为 0x17XXXXXXXX… 大约是这样,未必准确,未必一致
VS2012每个字符串占18字节(0x12) ()(每个字符串(数组),两边各加若干字节用于调试)
VC6 每个字符串占22字节 (0x16)
只是VS2012更加节约一点