[英]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.