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
的调用中使用未初始化的指针时,不能保证它会起作用,也不能保证它会抛出错误。基本上,任何事情都可能发生,有时甚至可以按预期工作,这使得此类错误更难查找和更正。
你需要为你的source
和destination
指针分配内存才能使用它们,你可以使用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
做任何额外的事情。它不是指针,而是已经分配的结构的一部分。
我有以下代码:
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
的调用中使用未初始化的指针时,不能保证它会起作用,也不能保证它会抛出错误。基本上,任何事情都可能发生,有时甚至可以按预期工作,这使得此类错误更难查找和更正。
你需要为你的source
和destination
指针分配内存才能使用它们,你可以使用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
做任何额外的事情。它不是指针,而是已经分配的结构的一部分。