Memcpy进入malloced结构内的数组

时间:2014-02-12 05:22:20

标签: c arrays pointers sizeof memcpy

这是我的情景。

struct X {
char A[10];
int foo;
};
struct X *x;
char B[10]; // some content in it.
x = malloc(sizeof(struct X));

要将内容从B复制到A,为什么以下语法正确无误:

memcpy(x->A, B, sizeof(x->A));

此处x->A被视为指针,因此我们不需要&。但那么我们应该sizeof(*x->A)对吗?但是*它不起作用,而没有*它工作正常。

sizeof运算符不像指针一样对待A吗?

5 个答案:

答案 0 :(得分:2)

A不是指针,而是数组。所以sizeof(x->A)是正确的语法,它是整个数组的大小,即10

在许多情况下,数组名称转换为指向第一个元素的指针。但sizeof(arrayname)不是其中之一。

答案 1 :(得分:2)

sizeof(* x-> A)给出char的大小(1个字节),而size0f(x-> A)给出整个数组的大小(10bytes)。

答案 2 :(得分:1)

sizeof(*x->A)相当于sizeof(x->A[0])

sizeof(*x->A)在这里是1再见。所以memcpy只会发生一个字节。

这是sizeof(x->A)是正确的程序。

答案 3 :(得分:0)

虽然在很多情况下数组名称会衰减到指针(就像示例中的memcpy()的第一个参数),但有一些不这样做,sizeof运算符参数就是其中之一。其他示例是一元&运算符参数等.C ++有更多场景(例如,数组引用的初始化器)。

答案 4 :(得分:0)

只是添加以前的评论

sizeof(x->A)是正确的sizeof(*x->A)不正确,因为->的优先级高于*所以首先获得A的地址(X-> A)然后{ {1}}再次将它引向第一个字节(一个字节字节)。

不要忘记sizeof运算符不考虑*个字符。如果字符串'\0'由A指向,那么它返回5(数组大小为6,包括'\ 0'), 因此,在复制到"Hello"时,您必须明确添加B,或者您可以增加要复制的字节数,如下所示。

'\0'