当我尝试编译以下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;
}
答案 0 :(得分:10)
此处p
指向分配后的字符串文字,而不是指定的内存!
然后你尝试用memcpy
写入内存。
许多C编译器在只读存储器中分配字符串文字,因此总线错误。
要解决您的问题,您应该将字符h,e,l,l和o复制到p
第一行main
分配的空间中},使用strncpy
。这使p
指向你自己分配的内存;后来的memcpy
会很好(前提是你没有溢出缓冲区)。
请注意,通常在直接分配给字符串变量时,您将使变量指向不同的内存地址。在您的代码中,您为几个字符串分配了空间,但是当您将字符串文字分配给变量时,您正在更改它们指向的位置,从而导致内存泄漏。
答案 1 :(得分:0)
在您的代码中,p = "hello"
"hello"
返回指向字符串hello
的指针,并且无法更改hello。您使用p = "hello"
表示make p
也指向此字符串。因此,当您尝试更改它时,您将收到错误。
正确的方法如下:
char a[] = "hello";
或
char *a = malloc(sizeof(char)*11); /*cast is not good*/
strcpy (a, "hello");
顺便说一句,使用malloc
最好不要使用像(char *)
或(int *)
这样的强制转换。