【发布时间】:2011-06-17 09:35:51
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
char *p[2];
char **pp = calloc(2, 4);
p[0] = "ab";
p[1] = "cd";
// p[2] = "ef";
pp[0] = "ab";
pp[1] = "cd";
pp[2] = "ef";
printf("pp: %s, %s, %s\n", pp[0], pp[1], pp[2]);
printf("size_p: %d\nsize_pp: %d\n", sizeof p, sizeof pp);
}
如果 'p[2]' 被定义并分配了一个值 - 结果行为是一个段错误。如果分配了 'pp[2]' - 输出如下:“ab, cd, ef”。 'sizeof' 为 'p' 返回 8(每个指针 2x4 字节),而为 'pp' 仅返回 4 个字节。为什么我能够分配'pp [2]',即使它应该只拥有8字节的分配内存(应该只能存储2个指针地址)?另外,'sizeof' 如何确定这两种情况下的实际内存大小?
【问题讨论】:
-
你在哪个平台/操作系统上运行这个程序?你用什么libc?
-
@levu Ubuntu,x86_64 GNU/Linux,glibc '2.7-10ubuntu7'