2012-04-03 121 views
1

我試過解決這個問題,只是沒有結果,我希望你可以暗示我在正確的方向。我有一個程序,我初始化字符數組是這樣的:C程序崩潰後strcpy

char variable1[8]; 

然後我試圖複製一個函數,即

... 
strcpy(variable1, (char *)function1()); 

其中功能1()返回字符數組值的返回值。 這裏是功能1的結構:

char* function1() 
{ 
    .... 
    char variable2[8]={'\0'}; 
    ... 
    return (variable2); 
} 

程序,當我嘗試執行的strcpy線崩潰。

我已經閱讀strcpy函數here

重要:您必須確保目標緩衝區(S1)是能夠包含源陣列中的所有字符,包括終止空字節。否則,的strcpy()將覆蓋存儲器過去緩衝區的末尾,引起緩衝區溢出,這可能導致程序崩潰

因此,我試圖增加變量1大小爲20,但仍程序崩潰。

除此之外,我嘗試了不同的方法,即使用strncpy函數調用,它仍然給我同樣的錯誤。

奇怪的是我可以執行function1(),它返回一個沒有問題的值。只有當我試圖複製它時,我的程序崩潰了。任何想法接下來我應該做什麼?

+0

瞭解如何使用調試器。向編譯器詢問它可以給你的所有警告(例如'gcc -Wall -Wextra'),然後改進你的源代碼直到沒有給出警告。 – 2012-04-03 07:05:53

回答

10

您的問題不是因爲您的目標緩衝區太小,而是因爲包含源字符串的變量在您嘗試使用它之前已超出範圍。

function1之內,variable2在堆棧上創建,但在退出該功能時會被有效銷燬。試圖在事後使用它(例如在strcpy操作中)是未定義的行爲。

如果你想要一個數組,將生存函數退出,你可能想從堆中分配它:

char *function1 (void) { 
    return calloc (1, 8); // allocate and zero out 8 bytes 
} 

,記得事後釋放指針。

+0

我明白你在說什麼,但函數1本身的內容增加了空終止符,即請參考上面已編輯的問題,其中我添加了function1()的內容。那麼現在,這可能是什麼問題? – 2012-04-03 07:22:10

+1

@ vampirus87:你已經從初始版本中改變了這個問題,所以我已經爲你更新了答案。 – paxdiablo 2012-04-03 07:26:29

+0

對,是的,我意識到添加function1的內容有很大的影響,這就是爲什麼。換句話說,你是說這個變量超出了範圍。但是在這裏'strcpy(variable1,(char *)function1());'我正在使用function1()調用權,從技術上講,它仍然適用? – 2012-04-03 07:31:39

1

問題是char的值不是char*,並且強制轉換並不能實現(它只是讓編譯器停止抱怨)。所以程序崩潰是因爲它試圖取消引用無效指針。

嘗試:

variable[0] = function1(); // store the returned character 
variable[1] = 0;   // make sure there's a terminating null char