当我定义:
char ch_array[50];
Run Code Online (Sandbox Code Playgroud)
&ch_array[0]和之间有什么区别ch_array?
如果我这样定义怎么办?
char *ch_array = (char *) malloc(sizeof(char)*50);
Run Code Online (Sandbox Code Playgroud)
这个问题实际上来自于我使用(&ch_array + 128)vs. &ch_array[128]时间bcopy(&ch_array + 128, buf, 128);.
我这里有一个segementation故障,但没有使用故障bcopy(&ch_array[128], buf, 128);,为什么?它与存储数组的位置有什么关系吗?
问题实际上来自于我使用
(&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
Run Code Online (Sandbox Code Playgroud)
是添加128 * sizeof(char[50])到的地址ch_array.通过我们在问题中给出的内容,添加调用未定义的行为,但在实践中,通常您将128*50 = 6400从头开始获取地址字节ch_array.
&ch_array[128]另一方面,是一个指向数组第128个元素的指针ch_array(它不存在,所以它是更加未定义的行为),从一开始就是128个字节ch_array.
如果你定义它
char *ch_array = (char *) malloc(sizeof(char)*50);
Run Code Online (Sandbox Code Playgroud)
然后ch_array是指向char它的指针,它也具有相同的值&ch_array[0],但与上面相反,不涉及转换.
然后,&ch_array是一个char**,并且&ch_array + 128将 - 没有被调用的未定义行为,因为ch_array它不是足够大的char*数组的元素- char**指向存储的位置128 * sizeof(char*)后面的位置字节ch_array.
(1)例外是当"T的数组"类型的表达式是sizeof或者address(&)运算符的操作数,以及它是用于初始化char数组的字符串文字,或用于初始化宽的字符串文字时字符数组.