来自GCC编译器的程序段错误:连接两个字符串
以下代码从GCC编译器引发segment error
:
char *str1 = "India"; char *str2 = "BIX"; char *str3; str3 = strcat(str1, str2); printf("%s %s\n", str3, str1);
问题是str3=strcat(str1, str2)
。
所以我的问题是:对于GCC编译器,它禁止指向同一个东西的两个指针?
您应该以代码方式编写的内容回答您的问题:
char *str1 = "India"; char *str2 = "BIX"; //should have been const char *str1 = "India"; const char *str2 = "BIX";
变量str1
和str2
被分配了内存中的字符串CONSTANTS India
和BIX
所在的地址。 该内存是只读的 。 您正在尝试使用strcat
连接这两个字符串。 好的,看看它的作用:
strcat(str1, str2); /\ take this || copy || =========== add to end
这需要str1
指向一个足够大的内存块,以容纳它自己和你连接到它的字符。 在字符串文字的情况下,情况永远不会如此。
还记得我是如何使用const
存储类说明符编写代码的吗? 现在看看strcat
的原型:
char * strcat(char * destination, const char *source);
该函数期望第一个参数是常规char *
,而不是const。 这告诉您函数将尝试更改指针指向的内存。 正如其他人所指出的,我在上面提到过:你的str1
指针指向的内存是只读的 ,因此是段错误。
你能写的是:
char str1[15] = "India"; const char *str2 = "BIX"; strcat(str1, str2);
这应该有效。 请注意, strcat
不会检查/防止溢出。 目标内存的大小应足够大,以容纳strlen(source) + strlen(destination) + 1
。 相反,使用strncat
会更好! 它允许您指定要连接到目标字符串的最大字符数:
size_t free_space = 15; char str1[free_space] = "India"; const char *str2 = "BIX"; free_space -= strlen(str1) + 1;//add 1 here, to ensure we'll have room for the terminating \0 char char *str3 = strncat( str1, str2, free_space ); //now we've concatenated something onto our string, keep track of free space left: free_space -= strlen(str2);//dangerous, though -> size_t is unsigned, perhaps best do: size_t src_len = strlen(str2); char *str3 = strncat( str1, str2, free_space ); if (src_len >= free_space) free_space = 0; else free_space -= src_len;
通常,字符串文字将被放入只读内存区域,您对strcat()
调用将尝试写入此只读内存区域,因此会出现段错误。
strcat的
char * strcat ( char * destination, const char * source );
连接字符串将源字符串的副本附加到目标字符串。 目标中的终止空字符被源的第一个字符覆盖,并且在由目标中的两个串联形成的新字符串的末尾包括空字符。
destination指向目标数组的指针,该数组应包含C字符串,并且足够大以包含连接的结果字符串。
但是你的目标不是指向数组的指针(大到足以包含连接的结果字符串)它是指向sting文字的指针,分段错误的原因是你要在只读存储器位置写入
尝试更改字符串文字会调用未定义的行为。 它是只读的,即使它不是const
限定的。
str3 = strcat(str1, str2);
上面的语句调用strcat
,它有原型
char *strcat(char *dest, const char *src);
这里的dest
是一个指向缓冲区的指针,该缓冲区足够大,可以将src
指向的字符串附加到它上面。 str1
是指向字符串文字的指针。 因此, strcat
将读取字符串str2
的字符并将其写入字符串str1
之外,这是非法的。 您不需要将strcat
的返回值保存在单独的char *
变量中,因为它会修改其第一个参数。 因此在strcat
返回之后, src
指向的字符串将附加到dest
指向的字符串。 您应该将代码更改为
#define MAX_SIZE 40 char str1[MAX_SIZE] = "India"; const char *str2 = "BIX"; // str1 must be large enough for // str2 to be appended to it strcat(str1, str2); printf("%s %s\n", str2, str1);
你需要这个:
char str1[100] = "India"; // str1 is an array for maximum 100 chars, initialized with "India" char *str2 = "BIX"; // str2 is a pointer to the string literal "BIX" (read only) char *str3 ; // str3 is pointer to char str3 = strcat(str1, str2); // appends "BIX" to "India" in the str1 buffer and puts str1 in str3 printf("%s %s\n", str3, str1);