面试题答案
一键面试潜在问题分析
- 指针关系运算:
- 在C语言中,指针的关系运算(如
<
)只有当两个指针指向同一块连续内存区域时才有明确的定义。这里p1
指向arr
数组的起始位置,而p2
指向arr + 7
,arr
数组只有5个元素,p2
指向了数组arr
内存区域之外的位置。这种情况下进行p1 < p2
的比较,其行为是未定义的。
- 在C语言中,指针的关系运算(如
- 内存访问:
p2
指向了数组arr
之外的内存,虽然代码中没有直接通过p2
访问内存,但这种指向数组外内存的指针操作可能在后续代码中导致未定义行为,如果通过p2
进行解引用操作(如*p2
),会访问到不属于程序可控的内存区域,可能导致程序崩溃、数据损坏等问题。
修正方法
- 确保指针在有效范围内:
- 可以通过修改
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;
}
- 边界检查:
- 在实际编程中,为了更稳健地处理指针操作,可以在使用指针之前进行边界检查,确保指针指向的位置在预期的内存区域内。例如:
#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;
}
这样可以避免因指针指向无效内存区域而导致的未定义行为。