我在x86_32上运行ubuntu ...并且在运行此程序时我一直遇到分段错误。
enter code here
#include<stdio.h>
#include<stddef.h>
char *memcp(char *dest, const char *src, size_t n)
{
char *dp = dest;
const char *sp = src;
while(n--)
*dp++ = *sp++;
return dest;
}
int main()
{
char *s = "abcde";
char *d;
char *r = memcp(d,s,6);
printf("%s",r);
return(0);
}
这段代码的问题在于它在我朋友的x86_64机器上运行在windows和ubuntu上。请帮帮我......
答案 0 :(得分:7)
至少有两种方法可以做到这一点:
malloc
方法:
int main(void)
{
char *s = "abcde";
char *d = malloc(6);
char *r = memcp(d, s, 6);
printf("%s",r);
free(d);
return(0);
}
数组方法:
int main(void)
{
char *s = "abcde";
char d[6];
memcp(d, s, 6);
return 0;
}
请注意,在代码中硬编码缓冲区长度通常不是一个好主意(例如,您正在硬编码6)。如果输入的大小发生变化而您忘记更新数字6,则会出现问题。
您遇到分段错误的原因是因为指针d
未指向任何位置。在memcp
函数中,您正在尝试编写此指针,但因为它没有指向任何有意义的程序崩溃。在C标准中,这称为未定义行为,基本上它意味着任何事情都可能发生。
另外,您可能会感兴趣的是,标准C库中已有两个功能,memmove
和memcpy
。如果源和目标区域重叠,则memmove
非常有用。如果您知道它们不会重叠,memcpy
可能会更快。
最后,我想指出,您不应该接受Artur关于未初始化指针使用的建议。您永远不应该依赖未初始化指针的值,这样做意味着您的程序的行为不定义良好。 C语言规范的附录J提到了以下未定义的行为:
J.2未定义的行为
- 在以下情况下,行为未定义:
醇>
- ...
- 在不确定的情况下使用具有自动存储持续时间的对象的值。
- ...