为什么这段代码会崩溃?

时间:2010-03-13 05:05:11

标签: c crash

为什么这段代码会崩溃? 在字符指针上使用strcat非法?

#include <stdio.h>
#include <string.h>

int main()
{
   char *s1 = "Hello, ";
   char *s2 = "world!";
   char *s3 = strcat(s1, s2);
   printf("%s",s3);
   return 0;
}

请在引用数组和指针时给出正确的方法。

3 个答案:

答案 0 :(得分:11)

问题是s1指向字符串文字,并且您尝试通过向其添加s2来修改它。您不能修改字符串文字。您需要创建一个字符数组并将两个字符串复制到其中,如下所示:

char *s1 = "Hello, ";
char *s2 = "world!";

char s3[100] = ""; /* note that it must be large enough! */
strcat(s3, s1);
strcat(s3, s2);
printf("%s", s3);

“足够大”意味着至少strlen(s1) + strlen(s2) + 1+ 1将考虑空终止符。

有人说过,你应该认真考虑使用strncat(或者可以说是更好但非标准的strlcat,如果有的话),这些都是经过边界检查的,因此远远优于{ {1}}。

答案 1 :(得分:1)

在这种情况下,正确的方法是在目标字符串(s1)中分配足够的空间来存储6个额外字符(s2)以及字符串的空终止符。

char s1[14] = "Hello, ";
char *s2 = "world!";
char *s3 = strcat(s1, s2);
printf("%s",s3);

答案 2 :(得分:0)

这是来自strcat()手册的引用:“strcat()函数将src字符串追加到dest字符串,覆盖dest末尾的空字节('\ 0'),然后添加一个终止null字节。字符串可能不重叠,dest字符串必须有足够的空间用于结果。“

这里的问题是s1和s2指向“只读”的静态字符串,所以如果你尝试执行strcat操作,在dest参数中使用这样的字符串,你将收到错误。

在这里创建hello world字符串的最佳方法是malloc它,这样它就能包含s1和s2。另外,不要忘记在printf格式字符串的末尾添加'\ n',否则您可能会感到惊讶。

如果我是你,我会写下这段代码:


int main()
{
  char* s1 = "Hello ";
  char* s2 = "World !";
  char *s3 = malloc((strlen(s1) + strlen(s2) + 1) * sizeof(char));
/* +1 is for the null terminating character
and sizeof(*s3) is the actual size of a char. */

  if (s3)
  {
    strcat(s3, s1);
    strcat(s3, s2);
    printf("%s\n", s3);
    free(s3); // always free what you alloc when you don't need it anymore.
  }
  return 0;
}