2011-07-27 36 views
0

可以初始化字符數組爲什麼的時候,如果數組大小留空,這樣爲什麼這個字符數組賽格故障

char str1[] = "Hello"; 

該計劃將賽格故障任何人向我解釋,但如果指定了它這樣

char str1[10] = "Hello"; 

它工作正常。

下面是完整的程序

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char concat_string(char str[], char str2[], char destination[], unsigned int bufferSize); 

int main(int argc, char *argv[]) 
{ 
    unsigned int bufferSize = 64; 
    // Both str1 and str2 must be defined 
    // or else the program will seg fault. 
    char str1[] = "Hello "; 
    char str2[] = "World"; 
    char concatenatedString[bufferSize]; 

    concat_string(str1,str2,concatenatedString,bufferSize); 

    printf("The concatenated string is: \n%s\n", concatenatedString); 
    return 0; 
} 


char concat_string(char str[], char str2[], char destination[], unsigned int bufferSize) 
{ 
    char buffer[bufferSize]; 
    strncat(str, str2, bufferSize); 
    strncpy(buffer,str, bufferSize); 
    strncpy(destination,buffer,bufferSize); 
    return *destination; 
} 

回答

7

你在你的concat_string功能有一個緩衝區溢出就在這裏:

strncat(str, str2, bufferSize); 

str只預留有7個字節,它在您嘗試附加str2之前,它已經滿了。你得到幸運的:

char str1[10] = "Hello"; 

因爲你還沒有分配給追加"World"給它足夠的空間;您也錯過了此版本str1的尾部空間,但這與您的段錯誤無關。您的concat_string應該直接複製strdestination,然後將str2附加到destination。這也可以避免改變strstr2的論點,這將更有禮貌;您也不會傳遞strstr1陣列的大小,因此無法知道是否有空間向其添加任何內容。

+1

是的。我是個白癡。這很有道理。 – FrozenWasteland

+0

@FrozenWasteland:我們都是從白癡開始的。製作mistaeks,吸取教訓,沖洗並重復。 –