完全相同
我已经写了这个小的C函数以从数组中删除整数。
/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int (*arr)[100], int idx, int count)
{
int i, j;
for (i = 0; i < count; i++)
for (j = idx; *arr[j]; j++)
*arr[j] = *arr[j+1];
}
说我这样运行:
int arr[100] = {25, 4, 4, 1, 2, 1, 2};
remove_int(&arr, 7, 2);
我会得到一个分段故障。为什么?
edit bluepixy解决了该问题,Chqrlie的回答解释了。谢谢大家!
您的代码不执行您认为做的事情:
-
arr
定义为指向100int
元素的数组。 -
arr[j]
并不指向偏移j
的元素,而是指向arr
指向的数组中的j
TH数组。 -
*arr[j]
删除位置的整数arr[j][0]
,远远超出了arr
数组的末端。
如果保留相同的API,则应以这种方式写代码:
/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int (*arr)[100], int idx, int count) {
int i, j;
for (i = idx + count; i < 100 && (*arr)[i]; i++)
(*arr)[i - count] = (*arr)[i];
for (j = 0; j < count && i - count + j < 100; j++) {
(*arr)[i - count + j] = 0;
}
在C处理数组的指针中不是惯用的,直接传递数组是更常见的,而所谓的函数接收到对数组的第一个元素的指针。
然后将这种函数称为:
int arr[100] = {25, 4, 4, 1, 2, 1, 2};
remove_int(arr, 7, 2);
,该函数将以这种方式写入:
/* remove `count` integers from `arr`, starting at index `idx` */
void remove_int(int arr[100], int idx, int count) {
int i, j;
for (i = idx + count; i < 100 && arr[i]; i++)
arr[i - count] = arr[i];
for (j = 0; j < count && i - count + j < 100; j++) {
arr[i - count + j] = 0;
}
在这种情况下,[100]
数组大小被忽略,并且该功能的行为与将其定义为void remove_int(int *arr, int idx, int count)