3

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

2 回答 2

10

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

然后你尝试用memcpy.

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

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

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

于 2012-04-21T04:50:16.500 回答
0

在您的代码中,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最好不要使用 cast like (char *)or (int *)

于 2012-04-21T08:16:53.280 回答