在 C 中将 malloc 用于动态数组
Using malloc for a dynamic array in C
我有下面这段代码。
我在第一次迭代后迭代 *attachmentsArray
时出现段错误,即使 size==3
也是如此。
我在这里做错了什么?
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] = '.';
正在取消引用(或试图)指针数组中的 'ith' 元素。
要访问 指向 的 array
数组的 'ith' 元素,您需要的是:
(*array)[i] = '.';
随时要求进一步澄清and/or解释。
索引运算符 ([]
) 的优先级高于取消引用运算符 (一元 *
)。实际上,最高运算符优先级层包含所有后缀运算符。因此,
*array[i] = '.'
相当于
*(array[i]) = '.'
。这是有效的,因为表达式 array[i]
具有类型 char *
,从这个意义上说,它是一元 *
的有效操作数,但对于 i
而非零,array[i]
没有指定有效的指针,尝试取消引用它会导致段错误也就不足为奇了。
相反,您想要
(*array)[i] = '.'
分段错误是由于 *array[i]="."因为 malloc 只是 returns 指向分配的内存起始地址的指针,你不能通过索引直接迭代..
其他答案也是正确的,但您也可以通过递增指针来指向相应的地址块,例如 *array = "."; *数组++;
我有下面这段代码。
我在第一次迭代后迭代 *attachmentsArray
时出现段错误,即使 size==3
也是如此。
我在这里做错了什么?
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] = '.';
正在取消引用(或试图)指针数组中的 'ith' 元素。
要访问 指向 的 array
数组的 'ith' 元素,您需要的是:
(*array)[i] = '.';
随时要求进一步澄清and/or解释。
索引运算符 ([]
) 的优先级高于取消引用运算符 (一元 *
)。实际上,最高运算符优先级层包含所有后缀运算符。因此,
*array[i] = '.'
相当于
*(array[i]) = '.'
。这是有效的,因为表达式 array[i]
具有类型 char *
,从这个意义上说,它是一元 *
的有效操作数,但对于 i
而非零,array[i]
没有指定有效的指针,尝试取消引用它会导致段错误也就不足为奇了。
相反,您想要
(*array)[i] = '.'
分段错误是由于 *array[i]="."因为 malloc 只是 returns 指向分配的内存起始地址的指针,你不能通过索引直接迭代..
其他答案也是正确的,但您也可以通过递增指针来指向相应的地址块,例如 *array = "."; *数组++;