当我想访问双指针时出现段错误

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 个字节。

为什么我们关心charchar*的大小?因为 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];

超出范围。