【问题标题】:Using memmove with pointer使用带有指针的 memmove
【发布时间】:2018-07-05 04:44:19
【问题描述】:

我搜索了整个 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(&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 非常难以理解......

【问题讨论】:

  • sizeof(Items) 是指针的大小。是的,每行大约有一个错误。
  • 启用所有警告并从那里开始。
  • 要清楚,Items = malloc(sizeof(Items)); ==> Items = malloc(sizeof(*Items));
  • ...并且 COPYTO 已经是一个指针,所以它只是 memmove(COPYTO, ..., 不需要 & 那里。同上 strcpy(&Items->x, ..., 因为x 已经是一个指针。
  • 好吧...伙计们。我知道我不理解指针和地址的概念。请告诉我我的想法是什么错误以及为什么......请记住,我来自 C#,一切都被简化了......

标签: c pointers struct memmove


【解决方案1】:

最大的问题在于这一行:

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

COPYTO 是一个指针。您使用malloc 分配了内存并保存了 这段记忆到COPYTO。这个地址就是你想要的目的地。

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

正确版本:

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

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

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

sizeof(expression) 返回expression 的字节数 记忆中的需要。 sizeof(Items) 返回指针的字节数 需要(因为 Item 是一个指针),而不是 JustArray-object 需要的字节数。

正确版本:

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

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

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

free(Items);
free(COPYTO);

strcpy(&Items->x,d);

你可以这样重写:

strcpy(Items->x, d);

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

对于下面的数组

char line[] = "Hello World";

这些是等价的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-03-23
    相关资源
    最近更新 更多