运行简单的字符串C程序时出现总线错误[重复]

| 这个问题已经在这里有了答案:
已邀请:
一点背景: 表达式“ 0”和“ 1”是字符串文字。它们分别是9个元素数组和3个元素的
char
数组(在C ++中为
const char
),具有静态范围(这意味着它们的内存在程序启动时分配,并保留到程序退出为止)。该内存可能是可写的,也可能是不可写的,具体取决于平台,因此尝试修改字符串文字会导致未定义的行为(这意味着编译器实际上可以执行其想要执行的任何操作)。简而言之,您无法写入字符串文字。 当您写
strcat(s, s1);
时,您会遇到两个问题:首先,目标数组是字符串文字,如上所述,它是不可写的。其次,它的大小不足以容纳其他字符。它的大小可以容纳9个字符(包括0终止符),但是您正尝试在其中存储11个字符。这是缓冲区溢出,如果您破坏了一些重要内容,则可能导致不良后果。 您必须分配一个可写的目标缓冲区。您有几种选择: 您可以声明一个足以容纳结果字符串的数组,尽管通常您不会在编译时知道“足够大”的大小:
char *s = \"this is \";
char *s1 = \"me\";
char target[11];
strcpy(target, s);
strcat(target, s1);
// alternately, sprintf(target, \"%s%s\", s, s1);
在C99中,可以声明一个可变长度数组(VLA),其大小在运行时才知道:known6ѭ 您可以使用
malloc
calloc
动态分配目标缓冲区(这实际上是首选方法,因为可以根据需要调整缓冲区的大小,这与VLA不同):
char *s = \"this is \";
char *s1 = \"me\";
char *target = malloc(strlen(s) + strlen(s1) + 1);
strcpy(target, s);
strcat(target, s1); 
// or sprintf(target, \"%s%s\", s, s1);
...
free(target); // when you\'re finished with the buffer
\"this is \"
\"me\"
是字符串文字,它们可能位于地址空间的只读部分。您不应尝试修改它们。
char s[] = \"this is \";
char s1[] = \"me\";  
这将确保将文字复制到堆栈中-这是可写的。然后,您后面的strcat将溢出堆栈缓冲区,这同样很糟糕。 以下方法将起作用-即使通常不使用
strcat
而不是
strncat
#include <stdio.h>
#include <string.h>
int main()
{
  char s[100] = \"this is \";
  char *s1 = \"me\";  
  strcat(s,s1); 
  printf(\"%s\",s);
  return 0;
}
您需要阅读更多有关字符串如何在C中工作以及字符数组和字符串文字之间的区别的更多信息。 为此,请按如下所示对其进行重写:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  char s[100] = \"this is \";
  char *s1 = \"me\";  

  strcat(s, s1); 

  printf(\"%s\", s);

  return EXIT_SUCCESS;
}
还有几点:
main()
返回
int
。 符号
EXIT_SUCCESS
(从
<stdlib.h>
起比0更清晰)。 在C语言中,不带参数的函数应声明为ѭ21For。对于
main()
,空括号无效。

要回复问题请先登录注册