当我想访问双指针时出现段错误
Segfault when i want to access a double pointer
int main(void)
{
char **lol;
lol = malloc(100);
*lol = malloc(100);
*lol[42] = 'd';
printf("%c", *lol[42]);
return (0);
}
有人能告诉我为什么会出现段错误吗?谢谢
长话短说:
lol = malloc(100);
*lol = malloc(100);
这是一件坏事TM。改为这样做
lol = malloc(100*sizeof*lol);
*lol = malloc(100*sizeof(**lol));
char
是一个字符,sizeof(char)
定义为1。
另一方面,char*
是指向 char
的指针,因此 sizeof(char*)
取决于您的系统。指针在 32 位系统上 通常 4 个字节,在 64 位系统上为 8 个字节。
为什么我们关心char
、char*
的大小?因为 malloc
的参数是根据 字节 而不是元素。所以当你这样做时:
lol = malloc(100);
您在内存中分配了 100 字节,但由于 lol
是一个指针,因此实际上只占 100/4 = 25 char*
个指针32 位系统和 100/8 = 12.5 char*
在 64 位系统上。
现在我还没有自己验证,但是根据 this handy tool 42 似乎大于 25 和 12.5 所以:
lol[42];
超出范围。
int main(void)
{
char **lol;
lol = malloc(100);
*lol = malloc(100);
*lol[42] = 'd';
printf("%c", *lol[42]);
return (0);
}
有人能告诉我为什么会出现段错误吗?谢谢
长话短说:
lol = malloc(100);
*lol = malloc(100);
这是一件坏事TM。改为这样做
lol = malloc(100*sizeof*lol);
*lol = malloc(100*sizeof(**lol));
char
是一个字符,sizeof(char)
定义为1。
char*
是指向 char
的指针,因此 sizeof(char*)
取决于您的系统。指针在 32 位系统上 通常 4 个字节,在 64 位系统上为 8 个字节。
为什么我们关心char
、char*
的大小?因为 malloc
的参数是根据 字节 而不是元素。所以当你这样做时:
lol = malloc(100);
您在内存中分配了 100 字节,但由于 lol
是一个指针,因此实际上只占 100/4 = 25 char*
个指针32 位系统和 100/8 = 12.5 char*
在 64 位系统上。
现在我还没有自己验证,但是根据 this handy tool 42 似乎大于 25 和 12.5 所以:
lol[42];
超出范围。