为什么这个char数组Seg Fault

时间:2011-07-27 03:27:26

标签: c arrays char segmentation-fault

任何人都可以向我解释为什么在初始化char数组时,如果数组大小是空白的,就像这样

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;
}

1 个答案:

答案 0 :(得分:7)

您的concat_string函数中有缓冲区溢出:

strncat(str, str2, bufferSize);

您的str只有七个字节的空间,并且在您尝试将str2附加到它之前它已经已满。你很幸运:

char str1[10] = "Hello";

因为您仍然没有足够的空间来追加"World";你也错过了这个str1版本的尾随空格,但这与你的段错误无关。您的concat_string应该str直接复制到destination,然后将str2追加到destination。这也可以避免改变strstr2参数,这样会更有礼貌;你也没有传递strstr1数组的大小,因此无法知道是否有空间向它们添加任何内容。