簡體   English   中英

strcpy之后C程序崩潰

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM