这是我的情景。
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
吗?
答案 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'