我有一个关于内存分配顺序的问题。
在下面的代码中,我循环分配了4个字符串。
但是,当我打印地址时,它们似乎没有一个接一个地分配……我是在做错什么,还是操作系统实现了某种防御机制,以防止可能的缓冲区溢出? (我使用Windows Vista)。

谢谢你。

 char **stringArr;
 int size=4, i;

 stringArr=(char**)malloc(size*sizeof(char*));
 for (i=0; i<size; i++)
    stringArr[i]=(char*)malloc(10*sizeof(char));

 strcpy(stringArr[0], "abcdefgh");
 strcpy(stringArr[1], "good-luck");
 strcpy(stringArr[2], "mully");
 strcpy(stringArr[3], "stam");

 for (i=0; i<size; i++) {
  printf("%s\n", stringArr[i]);
  printf("%d  %u\n\n", &(stringArr[i]), stringArr[i]);
 }

输出:

最佳答案

通常,当您通过malloc()请求内存时,C运行时库会将请求的大小四舍五入到最小分配大小。这样可以确保:

  • 运行时库为其簿记信息留出空间
  • ,对于运行时库来说,管理分配的块的效率更高,这些块都是某个大小(例如16个字节)的倍数。

  • 但是,这些是实现细节,您不能真正依赖malloc()的任何特定行为。

    10-04 12:17