[英]C program crashes after strcpy
我已經嘗試解決此問題,但最終還是一無所獲,希望您能向我提示正確的方向。 我有一個程序,我以這種方式初始化了一個char數組:
char variable1[8];
然后我嘗試復制一個函數的返回值,即
...
strcpy(variable1, (char *)function1());
其中function1()返回char數組值。 這是function1的結構:
char* function1()
{
....
char variable2[8]={'\0'};
...
return (variable2);
}
當我嘗試執行strcpy行時,程序崩潰。
我在這里閱讀了strcpy函數
重要說明:您必須確保目標緩沖區(s1)能夠包含源數組中的所有字符,包括終止空字節。 否則,strcpy()將覆蓋緩沖區末尾的內存,導致緩沖區溢出,這可能導致程序崩潰
因此,我嘗試將variable1的大小增加到20,但是程序仍然崩潰。
除此之外,我嘗試了不同的方法,即使用strncpy函數調用,它仍然給我相同的錯誤。
奇怪的是,我可以執行function1(),該函數返回一個沒有問題的值。 只有當我嘗試將其復制時,程序才會崩潰。 有什么想法我下一步應該做什么?
您的問題不是因為目標緩沖區太小,而是因為包含源字符串的變量在嘗試使用它之前已經超出范圍。
在function1
,在堆棧上創建了variable2
,但是在退出該函數時會有效地將其銷毀。 之后嘗試使用它(例如在strcpy
操作中)是未定義的行為。
如果想要一個可以在函數退出后繼續存在的數組,則可能要從堆中分配它:
char *function1 (void) {
return calloc (1, 8); // allocate and zero out 8 bytes
}
並記得之后釋放指針。
問題在於char
值不是char*
,並且強制轉換它不是這樣做的(這只會使編譯器停止抱怨)。 因此程序崩潰,因為它試圖取消引用無效的指針。
嘗試:
variable[0] = function1(); // store the returned character
variable[1] = 0; // make sure there's a terminating null char
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.