#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”如何确定这两种情况下的实际内存大小?
最佳答案
p
被声明为具有两个元素,因此 p[2]
不存在 - 因此出现段错误。由于 p
是一个局部数组(指针),sizeof(p)
给出元素类型的大小(元素类型是 char *
,其大小为 4) 乘以元素数 (2)。另一方面,pp
是一个指针(指向指针),而不是数组,因此 sizeof(p)
只是一个 char * 的大小*
,它与 32 位机器上任何其他指针的大小相同,即 4。对 pp[2]
的赋值似乎成功纯属偶然——你'正在分配的内存之外写入(它只包含两个 char *
元素的空间)。
顺便说一句,指向字符串文字的指针应该是const char *
。
关于c - 指向指针 malloc 和操作的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6383903/