我已经编写了这个小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);
我收到了分段错误。为什么呢?
Comment BLUEPIXY解析了答案 0 :(得分:3)
您的代码没有按照您的想法执行:
arr
被定义为指向100 int
个元素的数组的指针。arr[j]
未指向偏移j
处的元素,而是指向j
指向的数组中的arr
数组。*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)