面试题答案
一键面试#include <stdio.h>
// 函数声明
void modifyValues(int **ptrArray, int size);
int main() {
int num1 = 10, num2 = 20, num3 = 30;
int *ptrArray[3] = {&num1, &num2, &num3};
int i;
printf("修改前的值: ");
for (i = 0; i < 3; i++) {
printf("%d ", *(ptrArray[i]));
}
printf("\n");
modifyValues(ptrArray, 3);
printf("修改后的值: ");
for (i = 0; i < 3; i++) {
printf("%d ", *(ptrArray[i]));
}
printf("\n");
return 0;
}
void modifyValues(int **ptrArray, int size) {
int i;
for (i = 0; i < size; i++) {
**(ptrArray + i) += 10; // 修改指针所指向的值
}
}
指针变量的传递机制
在C语言中,函数参数传递是值传递。当我们将一个指针数组传递给函数时,实际上传递的是这个指针数组首元素的地址(也就是一个指针值的副本)。函数内部对这个副本指针的操作(比如移动指针位置等)不会影响到函数外部原来的指针数组。但是,如果通过这个指针副本去修改其所指向的内存区域的值,那么函数外部相应的内存区域的值也会改变,因为指针指向的是同一块内存。
可能出现的问题
- 空指针解引用:如果指针数组中的某个指针为
NULL
,在函数中对其进行解引用操作(如**(ptrArray + i)
)就会导致未定义行为,程序可能崩溃。所以在进行解引用操作前,应该先检查指针是否为NULL
。 - 内存越界:如果在函数中对指针数组的访问超出了其实际大小,也会导致未定义行为。例如,在上述代码中如果
size
传入了错误的值,导致访问ptrArray
越界,就会出现问题。 - 野指针:如果指针数组中的指针指向的是已经释放的内存(成为野指针),解引用野指针同样会导致未定义行为。所以要确保指针始终指向有效的内存区域。