【问题标题】:bus error: 10. C code, malloc example总线错误:10. C 代码,malloc 示例
【发布时间】:2012-05-02 15:12:23
【问题描述】:

当我尝试编译以下 C 代码时,我得到一个总线错误。 我猜这与我调用 memcpy 的方式有关,但我无法弄清楚。 任何帮助将不胜感激!

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

int main()
{

    char *p = (char*)malloc(sizeof(char)*11); 
    // Assign some value to p
    p = "hello";


    char *name = (char*)malloc(sizeof(char)*11);
    // Assign some value to name
    name = "Bye";

    memcpy (p,name,sizeof(char)*10); // Problem begins here
    return 0;
}

【问题讨论】:

标签: c bus memory-segmentation


【解决方案1】:

在您的代码中,p = "hello""hello" 返回一个指向字符串 hello 的指针,并且 hello 不能更改。你使用p = "hello" 意味着让p 也指向这个字符串。所以当你试图改变它时,你会得到一个错误。 正确的方法如下: char a[] = "hello";

char *a = malloc(sizeof(char)*11); /*cast is not good*/
strcpy (a, "hello");

顺便说一句,使用malloc 最好不要使用像(char *)(int *) 这样的演员表。

【讨论】:

    【解决方案2】:

    这里p 指向您分配后的字符串文字,而不是您分配的内存!

    然后您尝试使用memcpy 写入该内存。

    许多 C 编译器在只读内存中分配字符串文字,因此会出现总线错误。

    要解决您的问题,您应该复制字符 h、e、l、l 和 o 到 main 的第一行中为 p 分配的空间中,使用 @ 987654325@。这使p 指向您自己分配的内存;后面的memcpy 就可以了(当然前提是你的缓冲区没有溢出)。

    请注意,通常当您直接分配给字符串变量时,您会使变量指向不同的内存地址。在您的代码中,您为几个字符串分配了空间,但是当您将字符串文字分配给变量时,您正在更改它们指向的位置,从而导致内存泄漏。

    【讨论】:

    • 有什么办法可以写在p上吗?
    • 非常感谢!我一直在努力解决这个问题!
    • 代码不应该返回seg fault而不是bus error吗?总线错误是 CPU 无法物理解决的内存访问,而 seg 错误是 CPU 无法逻辑解决的内存访问(即 OP 的问题)。
    • 对于同一个问题,不同的编译器和不同的操作系统会出现不同的错误。对于 OP 的确切代码,如果你在 JDoodle for C99 上运行它,你会得到Command terminated by signal 11。在我的带有 clang 的 Mac 上(Apple LLVM 版本 9.0.0 (clang-900.0.39.2))我得到Bus error: 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多