gpt4 book ai didi

c - 将 memmove 与指针一起使用

转载 作者:行者123 更新时间:2023-11-30 19:06:15 27 4
gpt4 key购买 nike

我在 StackOverflow 上进行了搜索,但找不到我想要做的事情。我想将指针 Items 复制到指针 COPYTO。然后就可以调用COPYTO->x。

#include <stdio.h>

typedef struct JustArray {
char x[30];
} JustArray;

int main()
{
JustArray *Items, *COPYTO;
char d[10] = "Test";
Items = malloc(sizeof(Items));
COPYTO = malloc(sizeof(COPYTO));
strcpy(&Items->x,d);
memmove(&COPYTO, Items, sizeof(JustArray));

printf("Pointer: %p\n", &d);
printf("Address: %u\n",&d);
printf("Value: %s\n", Items->x);
printf("Value: %s\n", COPYTO->x);

return 0;
}

该程序可以编译,但不会运行。它有一个弹出窗口:访问冲突读取位置 0xabababab。

我来自 C#,发现 C 非常难以理解......

最佳答案

最大的问题是这一行:

memmove(&COPYTO, Items, sizeof(JustArray));

COPYTO 是一个指针。您使用 malloc 分配了内存并保存了将此内存复制到COPYTO。该地址就是您想要的目的地。

& 运算符返回变量的地址,&COPYTO 返回变量的地址COPYTO 变量的地址,不是它所指向的位置。

正确版本:

memmove(COPYTO, Items, sizeof(JustArray));

另一个问题是调用 malloc 的方式:

Items = malloc(sizeof(Items));
COPYTO = malloc(sizeof(COPYTO));

sizeof(表达式) 返回表达式的字节数内存中的需要。 sizeof(Items) 返回指针所占用的字节数需要(因为 Item 是一个指针),而不是 JustArray 对象需要的字节数。

正确版本:

Items = malloc(sizeof *Items);
COPYTO = malloc(sizeof *COPYTO);

请记住检查 malloc & 的返回值是一个好习惯 friend 们。如果它们返回NULL,则没有更多可用内存,您应该做一些错误处理。

此外,对于每个malloc,都必须有一个free。在 printf 的末尾,请这样做:

free(Items);
free(COPYTO);
<小时/>
strcpy(&Items->x,d);

你可以这样重写:

strcpy(Items->x, d);

原因是数组在传递给函数时会退化为指针将它们分配给指针。 “Decay”意味着它返回的地址数组的第一个元素。

对于以下数组

char line[] = "Hello World";

这些是等效的:

char *ptr1 = &line[0];
char *ptr2 = &(line[0]);
char *ptr3 = line;

关于c - 将 memmove 与指针一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48451265/

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