gpt4 book ai didi

c - 为什么复制内存时出现段错误

转载 作者:行者123 更新时间:2023-12-02 07:49:04 25 4
gpt4 key购买 nike

我在 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);
}

这段代码的问题是它在我 friend 的 x86_64 机器上运行,在 windows 和 ubuntu 上运行。请帮帮我..

最佳答案

至少有两种方法可以做到这一点:

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 库中已经有两个函数可用,您可能会感兴趣,memmovememcpy .如果源区域和目标区域重叠,memmove 很有用。如果您知道它们永远不会重叠,memcpy 可能会更快。

最后我想指出,您不应该接受 Artur 关于未初始化指针使用的建议。您永远不应该依赖未初始化指针的值,这样做意味着您的程序行为明确定义。 C 语言规范的附件 J 提到以下是未定义的行为:

J.2 Undefined Behaviour

  1. The behavior is undefined in the following circumstances:
    • The value of an object with automatic storage duration is used while it is indeterminate.

关于c - 为什么复制内存时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com