【问题标题】:Why does this char array Seg Fault为什么这个 char 数组 Seg Fault
【发布时间】:2011-07-27 03:27:25
【问题描述】:

谁能给我解释一下为什么在初始化一个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;
}

【问题讨论】:

    标签: c arrays char segmentation-fault


    【解决方案1】:

    concat_string 函数中出现缓冲区溢出:

    strncat(str, str2, bufferSize);
    

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

    char str1[10] = "Hello";
    

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

    【讨论】:

    • @FrozenWasteland:我们一开始都是白痴。犯错误,吸取教训,冲洗并重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多