1

当我定义:

char ch_array[50];
  1. &ch_array[0]和有什么区别ch_array

  2. 如果我这样定义呢?

    char *ch_array = (char *) malloc(sizeof(char)*50);
    

    问题实际上来自当我使用(&ch_array + 128)vs.&ch_array[128]时,当bcopy(&ch_array + 128, buf, 128);.

  3. 我在这里遇到了分段错误,但使用没有错误bcopy(&ch_array[128], buf, 128);,为什么?它与存储数组的位置有什么关系吗?

4

3 回答 3

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

是添加128 * sizeof(char[50])到 的地址ch_array。根据我们在问题中给出的内容,添加会调用未定义的行为,但实际上,您通常会128*50 = 6400ch_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数组的字符串文字或用于初始化宽字符串时字符数组。

于 2013-04-28T17:58:05.010 回答
1
bcopy(&ch_array[128], buf, 128);

相当于

bcopy(ch_array+128, buf, 128);

bcopy(&ch_array+128, buf, 128);

是完全不同的东西。

于 2013-04-28T17:58:03.637 回答
-1

首先,ch_array和是不同的,无论你使用&ch_array哪个定义。并且几乎是同义词,尽管编译器偶尔会窒息但接受. 并且都是 type 。是类型。ch_arraych_array&ch_array[0]ch_array&ch_array[0]ch_array&ch_array[0]char *&ch_arraychar **

ch_array + 128是 的同义词&ch_array[128]。它不是 的同义词&ch_array[128]。前者意味着 128 个字节到ch_array. 后者意味着 的地址后面有 128 个字符指针ch_array,这很可能是某种随机的;在您的情况下,它甚至不是您地址空间的一部分。

其次,如果您确实定义ch_array[50]并访问了第 128 个元素,那么您也需要在那里使用 SEGV。

于 2013-04-28T18:06:47.700 回答