问题实际上来自当我使用(&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数组的字符串文字或用于初始化宽字符串时字符数组。