这是我的代码
#import <stdio.h>
#import <string.h>
int main(int argc, const char *argv[])
{
char *str = "First string";
char *str2 = "Second string";
strcpy(str, str2);
return 0;
}
它编译得很好,没有任何警告或错误,但当我运行应用程序时,我得到了该错误
Bus error: 10
我想念的是什么?
答案 0 :(得分:38)
首先,您无法修改字符串文字。这是未定义的行为。
要解决此问题,您可以将str
设为本地数组:
char str[] = "First string";
现在,您将遇到第二个问题,str
是否足够大以容纳str2
。所以你需要增加它的长度。否则,您将超出str
- 这也是未定义的行为。
要解决第二个问题,您需要至少与str
一样str2
。或动态分配:
char *str2 = "Second string";
char *str = malloc(strlen(str2) + 1); // Allocate memory
// Maybe check for NULL.
strcpy(str, str2);
// Always remember to free it.
free(str);
还有其他更优雅的方法来处理涉及VLA(在C99中)和堆栈分配,但我不会进入那些因为它们的使用有点可疑。
@SangeethSaravanaraj在评论中指出,每个人都错过了#import
。它应该是#include
:
#include <stdio.h>
#include <string.h>
答案 1 :(得分:10)
没有为字符串分配空间。使用带有malloc()
和free()
除此之外
#import <stdio.h>
#import <string.h>
应该是
#include <stdio.h>
#include <string.h>
注意:
malloc()
ed必须为free()
'ed n + 1
的字符串分配n
个字节(最后一个字节用于\0
)请将以下代码作为参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
//char *str1 = "First string";
char *str1 = "First string is a big string";
char *str2 = NULL;
if ((str2 = (char *) malloc(sizeof(char) * strlen(str1) + 1)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
strcpy(str2, str1);
printf("str1 : %s \n", str1);
printf("str2 : %s \n", str2);
free(str2);
return 0;
}
答案 2 :(得分:7)
str2
指向静态分配的常量字符数组。你不能写它/它。您需要通过*alloc
系列函数动态分配空间。
答案 3 :(得分:5)
您的代码尝试覆盖字符串文字。这是未定义的行为。
有几种方法可以解决这个问题:
malloc()
然后strcpy()
然后free()
; str
转换为数组并使用strcpy()
; strdup()
。答案 4 :(得分:5)
这是因为str指向字符串文字意味着一个常量字符串......但是你试图通过复制来修改它。 注意:如果由于内存分配而导致错误,则在运行时会出现分段错误。但是这个错误是由于常量字符串修改而导致的,或者您可以通过以下内容了解更多详细信息:总线错误:< / p>
现在在x86上很少出现总线错误,并且当您的处理器甚至无法尝试请求的内存访问时发生错误,通常是:
访问不属于您的进程的内存时会发生分段错误,它们非常常见,通常是以下结果:
更确切地说,这不会操纵会导致问题的指针本身,而是访问它指向的内存(取消引用)。
答案 5 :(得分:4)
字符串文字在C
中是不可修改的答案 6 :(得分:1)
每当使用指针变量(asterix)时,例如
char *str = "First string";
你需要为它设置内存
str = malloc(strlen(*str))
答案 7 :(得分:0)
让我解释一下您为什么收到此错误“公交车错误:10”
char *str1 = "First string";
// for this statement the memory will be allocated into the CODE/TEXT segment which is READ-ONLY
char *str2 = "Second string";
// for this statement the memory will be allocated into the CODE/TEXT segment which is READ-ONLY
strcpy(str1, str2);
// This function will copy the content from str2 into str1, this is not possible because you are try to perform READ WRITE operation inside the READ-ONLY segment.Which was the root cause
如果要执行字符串操作,请使用自动变量(STACK段)或动态变量(HEAP段)
V骨