我在 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(©TO, 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(©TO, Items, sizeof(JustArray));
COPYTO
是一个指针。您使用 malloc
分配了内存并保存了
将此内存复制到COPYTO
。该地址就是您想要的目的地。
&
运算符返回变量的地址,©TO
返回变量的地址
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/