2013-12-11 145 views
-2

我對以下C代碼有點問題。如果我註釋掉「線24」然後我會得到下面的輸出:

aaaaaaaaaaaaaaaaaaaaaaaaa

,如果我不評論,我會得到如下:??

aaaaaaaaaaaaaaaaaaaaaaaaadƔLƔLƔF ?W'F'W'F'W'F'W'F'W'F'W'F'W'


有人可以告訴我爲什麼嗎?

我使用Mac OS X 10.5.4和gcc

printf導致輸出問題

void test(char* a , char* b); 

int main() 
{ 
    char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
    char* str2 = malloc(4*sizeof(str)); 
    test(str , str2); 
    return 0; 
} 

void test(char* a , char* b) 
{ 
    int i = 0; 
    printf("\n########\n"); 
    for(i = 0 ; i < strlen(a) ; i++) 
    { 
     printf("%d" , i); /******** LINE 24 ********/ 
     b[i] = a[i];   
    } 

    printf("\n########\n"); 
    for(i = 0 ; i < strlen(b) ; i++) 
    { 
     printf("%c" ,*(b+i)); 
    } 
    printf("\n########\n"); 

} 



感謝您回覆。

+2

如果你不給它一個0結尾的字符串,你認爲'strlen(b)'應該返回什麼? – 2013-12-11 16:11:59

回答

1

我看到你的代碼的兩個問題:的str2

首先分配:

char* str2 = malloc(4*sizeof(str)); // This will allocate 4 times the size of a char pointer. You cannot be sure that str will fit! 

秒的a複製到b。 您需要在b末尾添加一個字符串結束:

for(i = 0 ; i < strlen(a) ; i++) 
{ 
    printf("%d" , i); /******** LINE 24 ********/ 
    b[i] = a[i];   
} 
b[i] = '\0'; // Make sure b is properly terminated 
+1

另外他在每次迭代時都調用strlen,這在性能方面是不可取的。 –

+0

@Klas謝謝。 – Soosh

+0

@Michael不錯的提示。 – Soosh

1
char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
char* str2 = malloc(4*sizeof(str)); 

str是一個指針,它是尺寸(大概)32位 - >的4個字節。所以你分配的不是字符串的大小,但是一個字符串的大小四個指針需要(16個字節),你的字符串長度是26個字節(包括0字節)。

另外,當輸出一個字符串時,您必須分配一個比字節長的字節,以解釋指示字符串結尾的0字節。

char * str = "aaaaaaaaaaaaaaaaaaaaaaaaa"; 
char* str2 = malloc(strlen(str)+1); 

int i; 
for(i = 0 ; i < strlen(a) ; i++) 
{ 
    printf("%d" , i); /******** LINE 24 ********/ 
    b[i] = a[i];   
} 
b[i] = 0; // Terminate the string. 

如果不終止字符串,那麼函數對字符串的工作(如strlenprintf等)將untl他們遇到的0字節它可以在你的存儲器中的任何掃描串。因此,如果你的代碼中的strlen有時似乎給出了正確的長度,如果這樣的字節恰好在最後,但它會更經常地給出錯誤的結果(未定義的行爲),這說明了你在你看到的奇怪字符輸出。

+0

謝謝你的回答。 – Soosh