MST

星途 面试题库

面试题:C语言指针变量在函数参数传递中的深度剖析

请编写一个C函数,函数参数为一个指针数组,在函数内部对数组中的指针所指向的值进行修改,并说明函数调用过程中指针变量的传递机制和可能出现的问题。
26.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#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语言中,函数参数传递是值传递。当我们将一个指针数组传递给函数时,实际上传递的是这个指针数组首元素的地址(也就是一个指针值的副本)。函数内部对这个副本指针的操作(比如移动指针位置等)不会影响到函数外部原来的指针数组。但是,如果通过这个指针副本去修改其所指向的内存区域的值,那么函数外部相应的内存区域的值也会改变,因为指针指向的是同一块内存。

可能出现的问题

  1. 空指针解引用:如果指针数组中的某个指针为NULL,在函数中对其进行解引用操作(如**(ptrArray + i))就会导致未定义行为,程序可能崩溃。所以在进行解引用操作前,应该先检查指针是否为NULL
  2. 内存越界:如果在函数中对指针数组的访问超出了其实际大小,也会导致未定义行为。例如,在上述代码中如果size传入了错误的值,导致访问ptrArray越界,就会出现问题。
  3. 野指针:如果指针数组中的指针指向的是已经释放的内存(成为野指针),解引用野指针同样会导致未定义行为。所以要确保指针始终指向有效的内存区域。