我有以下代码:
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;
}
问题是,当我在arg2-> estination中使用strcpy时,一切运行良好,但是一旦取消对arg2-> source的strcpy的注释,我会立即遇到分段错误。怎么了?有办法解决这个问题吗?
答案 0 :(得分:3)
您是众所周知的 未定义行为 的受害者。您会看到,在对strcpy
的调用中使用了未初始化的指针时,无法保证它会工作,也不会抛出错误。基本上,任何事情都可能发生,有时甚至可以按预期运行,这使得这种类型的bug更加难以查找和纠正。
在使用source
和destination
指针之前,您需要为其分配内存,可以使用malloc(strlen("someString") + 1);
。并且不要忘了通过调用free
释放内存。尽早采用这种习惯将使您在将来会释放一些非常讨厌的错误以及更多未定义的行为。
答案 1 :(得分:1)
使用此语句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
做任何额外的事情。它不是指针,而是已分配的结构的一部分。