问题实际上来自当我使用(&ch_array + 128)
vs.&ch_array[128]
时bcopy(&ch_array + 128, buf, 128);
ch_array
是一个数组(char
准确地说是一个 50 的数组)。&ch_array[0]
是指向 的指针char
,指向ch_array
的初始元素的指针。
在大多数情况下,数组名称被转换为指向其初始元素的指针,但例外之一(1)是它是地址运算符的操作数&
。
因此&ch_array
是指向 50 数组的指针char
,并且
&ch_array + 128
是添加128 * sizeof(char[50])
到 的地址ch_array
。根据我们在问题中给出的内容,添加会调用未定义的行为,但实际上,您通常会128*50 = 6400
从ch_array
.
&ch_array[128]
另一方面,是指向数组的第 128 个元素的指针ch_array
(不存在,因此它是更多未定义的行为),距离ch_array
.
如果你定义它
char *ch_array = (char *) malloc(sizeof(char)*50);
thench_array
是指向 的指针char
,它也具有与 相同的值&ch_array[0]
,但与上述相反,不涉及转换。
然后,&ch_array
是 a char**
,并且&ch_array + 128
将是 - 没有调用的未定义行为,因为ch_array
不是足够大的char*
数组的元素 - achar**
指向存储位置128 * sizeof(char*)
后面的位置字节ch_array
。
(1)例外情况是“T 数组”类型的表达式是sizeof
或地址 ( &
) 运算符的操作数,并且当它是用于初始化char
数组的字符串文字或用于初始化宽字符串时字符数组。