考虑以下三个C函数。
[P1]
int *g(void) {
int x = 10;
return (&x);
}
[P2]
int *g(void) {
int *px;
*px = 10;
return px;
}
[P3]
int *g(void) {
int *px;
px = (int *)malloc(sizeof(int));
*px = 10;
return px;
}
以上三个函数中,哪一个容易导致指针出现问题?
a. 只有P3 b. 只有P1和P3 c. 只有P1和P2 d. P1、P2和P3。
我觉得应该是 d 因为如果堆满了, malloc
会返回一个空指针,P3甚至会失败。但后来我在网上看到,无论在哪里,凡是提到它的选项 c. 我想听听大家的意见!
鉴于问题问的是哪个是 可能 以引起问题,正确答案应该是c)P1和P2。
P1返回一个局部变量的地址。 如果该地址被解除引用(甚至被读取),它将调用 未定义行为.
P2取消引用一个未初始化的指针,这也是未定义的行为。
P3用 malloc
,在该内存位置存储一个值,并返回分配到内存的指针。 虽然这确实可能会导致一个问题,如果 malloc
失败,比起直接的未定义行为,它更不可能是一个问题。