[英]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 一起使用时,一切运行正常,但是一旦我使用 arg2->source 取消对 strcpy 的注释,我就会立即遇到分段错误。 怎么了? 有没有办法来解决这个问题?
您是众所周知的未定义行为的受害者。 您会看到,当在调用strcpy
时使用未初始化的指针时,不能保证它会工作,也不能保证它会引发错误。 基本上,任何事情都可能发生,有时甚至可以按预期工作,这使得这种类型的错误查找和纠正变得更加乏味。
在使用它们之前,您需要为source
指针和destination
指针分配 memory,您可以使用malloc(strlen("someString") + 1);
. 完成后,不要忘记通过调用free
释放 memory。 尽早采用这种习惯将使您在未来摆脱一些非常讨厌的错误和更多未定义的行为。
使用此语句struct argument *arg2 = malloc(sizeof(struct argument));
您为结构本身分配 memory。 该结构包含以下字段:
struct argument {
char *source; // << a pointer to a character string
char *destination; // << another pointer
int value; // integer value
};
接下来,您尝试使用以下指针之一复制字符串: strcpy(arg2->source, "a1");
. 但是...... memory中没有字符串的位置。 您为指针(结构的一部分)分配了位置,但没有为它将指向的字符串分配位置。 它会导致 memory 损坏和您的崩溃。
因此,在复制字符串之前,为它分配一些位置:
arg2->source = malloc(3);
你需要'3',它比字符串'a2'的长度长1个字符。
其他字符串相同。
您不需要为value
做任何额外的事情。 它不是指针,而是已经分配的结构的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.