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 - 后台线程上的多线程 TCP 服务器 - 如何强制从主线程关闭

c - 使用指针填充二维数组

c++ - 将一种数据类型的 vector 复制到相同数据类型的结构体 vector 中的有效方法是什么?

c - 小端到 uint,字节数不确定

C 套接字 : write() followed by close() results in incomplete data transfer

c - 共享内存初始化问题(三)

c - 插入函数中的指针在 C 中给出错误

c - 为什么我可以在其他地方同时定义指针时使用它?

c - 在不使用内存操作方法(malloc...等)的情况下初始化c中的结构

c++ - 动态结构数组错误