为什么这段简单的 C 代码会出现分段错误?

Why is this simple piece of C code giving a segmentation fault?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
    int size_to_alloc = sizeof(char*) * 1;
    char** p = (char**) malloc(size_to_alloc);
    p[0] = (char*) malloc (sizeof(char) * 10);
    strcpy("hello", p[0]);
    printf("%s\n", p[0]);
}

我显然缺少一些非常基本的东西,但无法弄清楚是什么。

只需在 strcpy 函数中做一些小改动:char *strcpy(char *dest, const char *src).

dest : 目标数组
src : 要复制的字符串。

喜欢:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {
    int size_to_alloc = sizeof(char*) * 1;
    char** p = (char**) malloc(size_to_alloc);
    p[0] = (char*) malloc (sizeof(char) * 10);
    strcpy(p[0],"Hello");      /* change */
    printf("%s\n", p[0]);
}

Output: Hello

请阅读 strcpy()man page。它说

char *strcpy(char *dest, const char *src);

因此,您需要将 first 参数作为 destination(又名,copy to), second 一个作为 source (aka copy from).

在您的情况下,"hello" 已作为 复制到 地址提供,并且 "hello" 是字符串文字,请尝试将任何内容复制到其中(即,修改字符串文字)将导致 undefined behavior,从而导致分段错误。

解决方法:交换函数调用的参数。

strcpy 以相反的顺序接受参数:首先是目标,其次是源。尝试:

strcpy(p[0], "hello");

strcpy() 函数的参数不匹配。

根据 man page char *strcpy(char *dest, const char *src);

使用字符串复制

所以你的 strcpy() 调用必须是 strcpy(p[0], "hello");