2011-07-27 22 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,吸取教训,冲洗并重复。 –