2017-04-07 82 views
-4
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(void) 
{ 
    char *p ; 
    char *q ; 
    char *l = "aaaaaasdfsfdqwecvxcxfwdsagfd" ; 
    p = (char*)malloc(sizeof(l)) ; 
    q = (char*)malloc(strlen(l)) ; 
    strcpy(p, l) ; 
    strcpy(q, l) ; 
    printf("%s\n",p) ; 
    printf("%s\n",q) ; 
    printf("%d\n",strlen(l)) ; 
    return 0 ; 
} 

請看看這個,在23個字符內輸入一些字符的時候,沒問題,輸入的字符超過23個,就像圖片顯示的那樣,我的結果顯示亂碼,爲什麼會這樣? enter image description herec sizeof()會導致溢出?

+5

不要將代碼作爲圖像發佈,這太可怕了。而你沒有分配足夠的內存,缺少null-termination字符。可能是這個問題,但現在我必須進行眼科手術,所以你會原諒我。 –

+1

我很抱歉,這是我第一次問stackoverflow問題,我會解決它。謝謝。我不認爲插件空終止字符在這裏工作,它已經存在了 –

回答

3

當你在指針上做sizeof時,你會得到指針的大小而不是它指向的內存。這通常是4或8,具體取決於您是在32位還是64位系統上。

然後strlen返回字符串的長度而不是空終止符。

這兩種尺寸都是很小以容納帶終止符的完整字符串,導致未定義行爲strcpy調用超出界限時。

+0

我明白了!謝謝。 –

+0

但我仍然有一個問題,當我對指針做sizeof時,我得到一個4字節的mem,而我輸入的字符串超過4個字符,實際上它有23個字節,所以爲什麼我可以得到4個以上的正確字符輸出? –

+0

@LiuYikai爲了得到正確的字符串長度,你應該使用'strlen'。要獲得包含*終止符的字符串*的長度,可以在'strlen'返回的長度上添加一個(例如,在您的示例中爲'strlen(l)+ 1') –