指针数组的元素指向字符串时,该字符串所占内存大小求解释

0店小二 2016-06-22 04:19:17
期初觉得理解了指针数组了,但是偶然间发现指针数组元素所指向的字符串占用1byte内存,很不理解!!!下边贴图
还有,我分别用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");
}
...全文
496 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-06-23
  • 打赏
  • 举报
回复
升序降序都对,你在改成 release 版,看下结果
lm_whales 2016-06-23
  • 打赏
  • 举报
回复
二者输出结果还是基本一致的, VC6 应用程序基址 是0x400000 VS2012 基址为 0x17XXXXXXXX... 大约是这样,未必准确,未必一致 VS2012每个字符串占18字节(0x12) ()(每个字符串(数组),两边各加若干字节用于调试) VC6 每个字符串占22字节 (0x16) 只是VS2012更加节约一点
赵4老师 2016-06-22
  • 打赏
  • 举报
回复
不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质, 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
小灸舞 版主 2016-06-22
  • 打赏
  • 举报
回复
标准并没有规定要升序还是降序,所以怎么样都是可以的。
字符串占内存大小不一样,用 objdump 查看一下就都清楚了.
0店小二 2016-06-22
  • 打赏
  • 举报
回复
这是截图,刚才不知为什么没传上
VS2012测试

VC6.0测试
dustpg 2016-06-22
  • 打赏
  • 举报
回复
lz的结果呢,难道让我们去下个vc6.0再跑这个段代码?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧