使用指针

时间:2018-01-25 20:22:09

标签: c pointers struct memmove

我搜遍了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难以理解......

1 个答案:

答案 0 :(得分:1)

最大的问题在于这一行:

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

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

& - 运算符返回变量的地址,&COPYTO返回 <{1}}变量的地址,不是指向的位置。

正确版本:

COPYTO

另一个问题是您拨打memmove(COPYTO, Items, sizeof(JustArray)); 的方式:

malloc

Items = malloc(sizeof(Items)); COPYTO = malloc(sizeof(COPYTO)); 返回sizeof(expression)的字节数 记忆中的需要。 expression返回指针的字节数 需求(因为sizeof(Items)是一个指针),而不是Item - 对象需要的字节数。

正确版本:

JustArray

请记住检查Items = malloc(sizeof *Items); COPYTO = malloc(sizeof *COPYTO); &amp;的返回值是一个好习惯。 朋友。如果他们返回malloc,则没有更多可用内存,您应该这样做 做一些错误处理。

此外,对于每个NULL,必须有malloc。在free s结束时, 请做:

printf
free(Items);
free(COPYTO);

您可以这样重写:

strcpy(&Items->x,d);

原因是数组在传递给函数时会衰减为指针 将它们分配给指针。 &#34;衰变&#34;意味着它返回的地址 数组的第一个元素。

对于以下数组

strcpy(Items->x, d);

这些是等价的:

char line[] = "Hello World";