strcpy to struct 时出现分段错误

Segmentation fault when strcpy to struct

我有以下代码:

struct argument {
    char *source;
    char *destination;
    int value;
};

int main(void){
    struct argument *arg2 = malloc(sizeof(struct argument));
    strcpy(arg2->source, "a1"); //This gives segmentation fault.
    strcpy(arg2->destination, "a2");
    arg2->value = 1500;

    return 0;
}

问题是,当我将 strcpy 与 arg2->destination 一起使用时,一切运行正常,但是一旦我取消对 strcpy 与 arg2->source 的注释,我立即遇到分段错误。怎么了?有办法解决这个问题吗?

您是众所周知的未定义行为 的受害者。您会看到,当在对 strcpy 的调用中使用未初始化的指针时,不能保证它会起作用,也不能保证它会抛出错误。基本上,任何事情都可能发生,有时甚至可以按预期工作,这使得此类错误更难查找和更正。

你需要为你的sourcedestination指针分配内存才能使用它们,你可以使用malloc(strlen("someString") + 1);。并且 不要 忘记在调用 free 完成后释放内存。及早养成这个习惯会 免去 你将来一些非常讨厌的错误,以及更多 未定义的行为

使用此语句 struct argument *arg2 = malloc(sizeof(struct argument)); 可以为结构本身分配内存。该结构包含以下字段:

struct argument {
    char *source;  // << a pointer to a character string
    char *destination; // << another pointer
    int value; // integer value
};

接下来您将尝试使用指针之一复制字符串:strcpy(arg2->source, "a1");。但是......内存中没有该字符串的位置。您为指针(结构的一部分)分配了位置,但没有为它指向的字符串分配位置。它会导致内存损坏和崩溃。

因此,在复制字符串之前,为其分配一些位置:

arg2->source = malloc(3); 

你需要 '3',它比字符串的长度长 1 个字符 'a2'。

其他字符串相同。

您不需要为 value 做任何额外的事情。它不是指针,而是已经分配的结构的一部分。