ber和&ch_array [0]和ch_array有什么区别?

jch*_*nxu 1 c arrays char

当我定义:

char ch_array[50];
Run Code Online (Sandbox Code Playgroud)
  1. &ch_array[0]和之间有什么区别ch_array

  2. 如果我这样定义怎么办?

    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);.

  3. 我这里有一个segementation故障,但没有使用故障bcopy(&ch_array[128], buf, 128);,为什么?它与存储数组的位置有什么关系吗?

Dan*_*her 5

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