任何人都可以向我解释为什么在初始化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;
}
答案 0 :(得分:7)
您的concat_string
函数中有缓冲区溢出:
strncat(str, str2, bufferSize);
您的str
只有七个字节的空间,并且在您尝试将str2
附加到它之前它已经已满。你很幸运:
char str1[10] = "Hello";
因为您仍然没有足够的空间来追加"World"
;你也错过了这个str1
版本的尾随空格,但这与你的段错误无关。您的concat_string
应该str
直接复制到destination
,然后将str2
追加到destination
。这也可以避免改变str
和str2
参数,这样会更有礼貌;你也没有传递str
和str1
数组的大小,因此无法知道是否有空间向它们添加任何内容。