-1

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

4

1 回答 1

2

最大的问题是这条线:

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

COPYTO是一个指针。您分配了内存malloc并将此内存的开头保存到COPYTO. 这个地址就是你想要的目的地。

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

请记住,检查 & Friends 的返回值是一个好习惯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;
于 2018-01-25T20:42:53.703 回答