我有以下代码:
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一起使用时,一切都运行良好,但一旦我取消对带有arg2->source的strcpy的注释,我就会立即出现分段错误。怎么了?有办法解决这个问题吗?
您是著名的未定义行为的受害者。您可以看到,当在对strcpy
的调用中使用未初始化的指针时,既不能保证它能工作,也不能保证它会抛出错误。基本上,任何都可能发生,有时甚至可以按预期工作,这使得查找和纠正这种类型的错误更加乏味。
在使用source
和destination
指针之前,您需要为它们分配内存,您可以使用malloc(strlen("someString") + 1);
。并且不要在调用free
后忘记释放内存。尽早养成这个习惯将使在未来摆脱一些非常讨厌的bug,以及更多未定义的行为。
使用此语句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",它比字符串"a2"的长度长1个字符。
其他字符串也是如此。
您不需要为value
做任何额外的事情。它不是指针,而是结构的一部分,已经分配了。