我有下面这段代码。
当我在第一次迭代后对*attachmentsArray
进行迭代时,即使是size==3
,我也会出现segferred。我在这里做错了什么?
void secondary(char** array, long size)
{
*array = (char*)malloc(size*sizeof(char));
for(int i = 0; i < size; i++)
{
*array[i] = '.';
}
}
void main()
{
char* attachmentsArray;
long size = 3;
secondary(&attachmentsArry, size);
}
索引运算符([]
(的优先级高于解引用运算符(一元*
(。实际上,最高的运算符优先级由所有后缀运算符组成。因此,
*array[i] = '.'
相当于
*(array[i]) = '.'
这是有效的,因为表达式array[i]
的类型为char *
,从这个意义上说,它是一元*
的有效操作数,但对于除零之外的i
,array[i]
不会指定有效指针,尝试取消引用它会导致segfault也就不足为奇了。
相反,你想要
(*array)[i] = '.'
问题在于*
和[]
运算符的相对优先级。您的线路:
*array[i] = '.';
正在取消引用(或试图(指针数组中的"ith"元素。
要访问array
指向的数组的"第i个"元素,您需要的是:
(*array)[i] = '.';
请随时要求进一步澄清和/或解释。
分段错误是由于*array[i]=".",因为malloc只返回一个指向所分配内存起始地址的指针,所以不能直接通过索引进行迭代器。。
其他答案也是正确的,但您也可以通过增加指针来指向相应的地址块,如*array="."*数组++;