c - 总线错误 : 10. C 代码,malloc 示例

标签 c bus memory-segmentation

当我尝试编译以下 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;
}

最佳答案

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

然后你尝试用 memcpy 写入内存.

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

要解决您的问题,您应该复制字符 h、e、l、l 和 o 到您为 p 分配的空间中在 main 的第一行, 使用 strncpy .这保持p指向你自己分配的内存;后者memcpy会没事的(前提是你当然不会溢出你的缓冲区)。

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

关于c - 总线错误 : 10. C 代码,malloc 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256301/

相关文章:

c - 指针前/后增量

c - 如何使用 asprintf

c++ - 是否有通用的 I2C 命令来查看设备是否仍存在于总线上?

android - 绘制巴士路线到谷歌地图

visual-c++ - __addgs* 如何使用,什么是 GS?

c - C编译程序使用哪些段?

operating-system - 每个程序是否在内存中都有自己独立的段(代码、堆栈、数据)?

c - 拦截来自操作系统的输入

c - SIGSEGV 在 memalign 中运行 efence