将 memmove 与指针一起使用
Using memmove with pointer
我在整个 Whosebug 上进行了搜索,但找不到我想要做的事情。我想将指针 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
。这个地址就是你要的目的地。
&
运算符return是变量的地址,©TO
return是
COPYTO
变量的地址, 不是 它指向的地方。
正确版本:
memmove(COPYTO, Items, sizeof(JustArray));
另一个问题是你调用的方式 malloc
:
Items = malloc(sizeof(Items));
COPYTO = malloc(sizeof(COPYTO));
sizeof(expression)
returns expression
的字节数
记忆中的需要。 sizeof(Items)
returns 一个指针的字节数
需要(因为 Item
是一个指针),而不是 JustArray
对象需要的字节数。
正确版本:
Items = malloc(sizeof *Items);
COPYTO = malloc(sizeof *COPYTO);
请记住,最好检查 malloc
的 return 值 &
朋友们。如果他们 return NULL
,没有更多的可用内存,你应该
做一些错误处理。
此外,对于每个 malloc
,必须有一个 free
。在 printf
秒结束时,
请做:
free(Items);
free(COPYTO);
strcpy(&Items->x,d);
你可以这样改写:
strcpy(Items->x, d);
原因是数组在将它们传递给函数时会衰减为指针,并且
将它们分配给指针。 "Decay" 表示它 returns 的地址
数组的第一个元素。
对于以下数组
char line[] = "Hello World";
这些是等价的:
char *ptr1 = &line[0];
char *ptr2 = &(line[0]);
char *ptr3 = line;
我在整个 Whosebug 上进行了搜索,但找不到我想要做的事情。我想将指针 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
。这个地址就是你要的目的地。
&
运算符return是变量的地址,©TO
return是
COPYTO
变量的地址, 不是 它指向的地方。
正确版本:
memmove(COPYTO, Items, sizeof(JustArray));
另一个问题是你调用的方式 malloc
:
Items = malloc(sizeof(Items));
COPYTO = malloc(sizeof(COPYTO));
sizeof(expression)
returns expression
的字节数
记忆中的需要。 sizeof(Items)
returns 一个指针的字节数
需要(因为 Item
是一个指针),而不是 JustArray
对象需要的字节数。
正确版本:
Items = malloc(sizeof *Items);
COPYTO = malloc(sizeof *COPYTO);
请记住,最好检查 malloc
的 return 值 &
朋友们。如果他们 return NULL
,没有更多的可用内存,你应该
做一些错误处理。
此外,对于每个 malloc
,必须有一个 free
。在 printf
秒结束时,
请做:
free(Items);
free(COPYTO);
strcpy(&Items->x,d);
你可以这样改写:
strcpy(Items->x, d);
原因是数组在将它们传递给函数时会衰减为指针,并且 将它们分配给指针。 "Decay" 表示它 returns 的地址 数组的第一个元素。
对于以下数组
char line[] = "Hello World";
这些是等价的:
char *ptr1 = &line[0];
char *ptr2 = &(line[0]);
char *ptr3 = line;