【问题标题】:What is the meaning of Bus: error 10 in C总线:C中的错误10是什么意思
【发布时间】:2012-01-03 18:09:34
【问题描述】:

下面是我的代码

#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

我错过了什么?

【问题讨论】:

  • 好吧,strlen(str)&lt;strlen(str2)
  • 大家都缺#import吗?!!
  • @SangeethSaravanaraj 是的,我自己都不敢相信。大声笑每个人都错过了...
  • 还有const char *argv[],这在托管环境中无效。你应该使用char *argv[]

标签: c


【解决方案1】:

一方面,您不能修改字符串文字。这是未定义的行为。

要解决这个问题,您可以将 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 在 cmets 中指出的那样,每个人都错过了#import。应该是#include:

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

【讨论】:

  • Mystical,#import 在 C 中支持 clang 和 GCC,并且是一个 Objective-C 扩展。 OP 的代码没有问题,因为它只添加了自动包含防护,没有别的。
  • 神秘的。
【解决方案2】:

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

除此之外

#import <stdio.h>
#import <string.h>

应该是

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

注意:

  • 任何malloc()ed 都必须是free()'ed
  • 你需要为长度为n的字符串分配n + 1字节(最后一个字节是\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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        1. 使用malloc() 然后strcpy() 然后free();
        2. str转为数组并使用strcpy()
        3. 使用strdup()

        【讨论】:

          【解决方案6】:

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

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

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

          在访问不属于您的进程的内存时会发生分段错误,它们很常见,通常是以下原因造成的:

          • 使用指向已释放对象的指针。
          • 使用了一个未初始化的假指针。
          • 使用空指针。
          • 缓冲区溢出。

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

          【讨论】:

            【解决方案7】:

            让我解释一下为什么会出现此错误“Bus error: 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 段)

            瓦桑特

            【讨论】:

              【解决方案8】:

              每当您使用指针变量(星号)时,例如

              char *str = "First string";

              你需要给它分配内存

              str = malloc(strlen(*str))

              【讨论】:

                猜你喜欢
                • 2014-06-10
                • 2012-04-27
                • 2016-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多