MST

星途 面试题库

面试题:C语言指针关系运算与数组越界

下面是一段C语言代码: ```c #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p1 = arr; int *p2 = arr + 7; if (p1 < p2) { printf("p1 is less than p2"); } return 0; } ``` 这段代码有什么潜在问题?从指针关系运算和内存访问的角度分析,并说明如何修正。
11.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

潜在问题分析

  1. 指针关系运算
    • 在C语言中,指针的关系运算(如<)只有当两个指针指向同一块连续内存区域时才有明确的定义。这里p1指向arr数组的起始位置,而p2指向arr + 7arr数组只有5个元素,p2指向了数组arr内存区域之外的位置。这种情况下进行p1 < p2的比较,其行为是未定义的。
  2. 内存访问
    • p2指向了数组arr之外的内存,虽然代码中没有直接通过p2访问内存,但这种指向数组外内存的指针操作可能在后续代码中导致未定义行为,如果通过p2进行解引用操作(如*p2),会访问到不属于程序可控的内存区域,可能导致程序崩溃、数据损坏等问题。

修正方法

  1. 确保指针在有效范围内
    • 可以通过修改p2的赋值,使其指向arr数组内的有效位置。例如,将p2指向数组的最后一个元素:
#include <stdio.h>
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p1 = arr;
    int *p2 = arr + 4; // 指向数组的最后一个元素
    if (p1 < p2) {
        printf("p1 is less than p2");
    }
    return 0;
}
  1. 边界检查
    • 在实际编程中,为了更稳健地处理指针操作,可以在使用指针之前进行边界检查,确保指针指向的位置在预期的内存区域内。例如:
#include <stdio.h>
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p1 = arr;
    int *p2 = arr + 7;
    if (p2 >= arr && p2 < arr + 5) {
        if (p1 < p2) {
            printf("p1 is less than p2");
        }
    }
    return 0;
}

这样可以避免因指针指向无效内存区域而导致的未定义行为。