我搜遍了StackOverflow,但找不到我想要做的事情。我想将指针项复制到指针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难以理解......
答案 0 :(得分:1)
最大的问题在于这一行:
memmove(©TO, Items, sizeof(JustArray));
COPYTO
是一个指针。您使用malloc
分配了内存并保存了开头
这个记忆到COPYTO
。这个地址是你想要的目的地。
&
- 运算符返回变量的地址,©TO
返回
<{1}}变量的地址,不是指向的位置。
正确版本:
COPYTO
另一个问题是您拨打memmove(COPYTO, Items, sizeof(JustArray));
的方式:
malloc
Items = malloc(sizeof(Items));
COPYTO = malloc(sizeof(COPYTO));
返回sizeof(expression)
的字节数
记忆中的需要。 expression
返回指针的字节数
需求(因为sizeof(Items)
是一个指针),而不是Item
- 对象需要的字节数。
正确版本:
JustArray
请记住检查Items = malloc(sizeof *Items);
COPYTO = malloc(sizeof *COPYTO);
&amp;的返回值是一个好习惯。
朋友。如果他们返回malloc
,则没有更多可用内存,您应该这样做
做一些错误处理。
此外,对于每个NULL
,必须有malloc
。在free
s结束时,
请做:
printf
free(Items);
free(COPYTO);
您可以这样重写:
strcpy(&Items->x,d);
原因是数组在传递给函数时会衰减为指针 将它们分配给指针。 &#34;衰变&#34;意味着它返回的地址 数组的第一个元素。
对于以下数组
strcpy(Items->x, d);
这些是等价的:
char line[] = "Hello World";