c - 将 memmove 与指针一起使用

标签 c pointers struct memmove

我在 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(&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。该地址就是您想要的目的地。

& 运算符返回变量的地址,©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/

相关文章:

C++ - 将数据传递给结构

c - 为什么需要转换指针算法?

c - -pie 究竟做了什么?

c++ - 使用 "->"调用函数

c - 使用 C 中的函数输入和打印静态矩阵

c++ - 通过在 getter 方法上应用 begin() 获得的迭代器不允许访问指向列表的第一个元素

c - 稍后在程序中不会遵循用户定义的值

通过标记连接创建包含通用字符名称的标识符

c - 两个元素相加的数据结构

c++ - 未对齐读/写的可移植性如何?