将 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(&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。这个地址就是你要的目的地。

&运算符return是变量的地址,&COPYTOreturn是 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;