为什么这个char数组Seg Fault

Fro*_*and 0 c arrays char segmentation-fault

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

char str1[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

程序会出现故障,但如果是这样指定的话

char str1[10] = "Hello";
Run Code Online (Sandbox Code Playgroud)

它工作正常.

这是完整的计划

#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;
}
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 7

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

strncat(str, str2, bufferSize);
Run Code Online (Sandbox Code Playgroud)

str只有七个字节的空间,在你尝试追加之前它已经满str2了.你很幸运:

char str1[10] = "Hello";
Run Code Online (Sandbox Code Playgroud)

因为你仍然没有足够的空间来附加"World"它; 您还错过了此版本的尾随空格,str1但这与您的段错误无关.您concat_string应该复制str直接destination,然后附加str2destination.这也可以避免改变strstr2论证,这将更有礼貌; 你也没有传递strstr1数组的大小,所以没有办法知道是否有空间可以附加任何内容.