总线错误:10错误

sum*_*erc 42 c

这是我的代码

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

int main(int argc, const char *argv[])
{
    char *str = "First string";
    char *str2 = "Second string";

    strcpy(str, str2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译得很好没有任何警告或错误,但当我运行应用程序时,我得到了该错误

Bus error: 10
Run Code Online (Sandbox Code Playgroud)

我想念的是什么?

Mys*_*ial 41

首先,您无法修改字符串文字.这是未定义的行为.

要修复它,您可以创建str一个本地数组:

char str[] = "First string";
Run Code Online (Sandbox Code Playgroud)

现在,你将遇到第二个问题,那个问题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);
Run Code Online (Sandbox Code Playgroud)

还有其他更优雅的方法来处理涉及VLA(在C99中)和堆栈分配,但我不会进入那些因为它们的使用有些可疑.


正如@SangeethSaravanaraj在评论中指出的那样,每个人都错过了#import.它应该是#include:

#include <stdio.h>
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

  • 对于clang和GCC,C中都支持神秘的`#import`,并且是一个Objective-c扩展.OP的代码没有问题,因为它只增加了自动包含警卫而没有别的. (18认同)

San*_*raj 11

没有为字符串分配空间.使用带malloc()和的数组(或)指针free()

除此之外

#import <stdio.h>
#import <string.h>
Run Code Online (Sandbox Code Playgroud)

应该

#include <stdio.h>
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

注意:

  • 任何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;
}
Run Code Online (Sandbox Code Playgroud)

  • +1是唯一注意到`#import'的人. (2认同)

mea*_*gar 7

str2指向静态分配的常量字符数组.你不能写它/它.您需要通过*alloc函数系列动态分配空间.


oua*_*uah 6

字符串文字在 C 中是不可修改的


NPE*_*NPE 5

您的代码尝试覆盖字符串文字.这是未定义的行为.

有几种方法可以解决这个问题:

  1. 使用malloc()strcpy()然后free(),
  2. 变成str数组并使用strcpy();
  3. strdup().


joh*_*ohn 5

这是因为str指向字符串文字意味着一个常量字符串......但是你试图通过复制来修改它.注意:如果由于内存分配而导致错误,则在运行时会出现分段错误.但是这个错误是由于常量字符串修改而导致的,或者您可以通过以下内容了解更多详细信息:总线错误:

现在,在x86上很少出现总线错误,并且当您的处理器甚至无法尝试请求的内存访问时发生错误,通常是:

  • 使用处理器指令,其地址不满足其对齐要求.

访问不属于您的进程的内存时会发生分段错误,它们非常常见,通常是以下结果:

  • 使用指向已解除分配的内容的指针.
  • 使用未初始化的虚假指针.
  • 使用空指针.
  • 溢出缓冲区.

更确切地说,这不是操纵将导致问题的指针本身,而是访问它指向的内存(解除引用).