下程序中,能够通过调用函数 fun,是 main 函数中的指针变量 p 指向一个合法的整型单元(变量)的是();
A:
main()
{
int *p;
fun(p);
...
}
int fun(int *p)
{
int s;
p = &s;
}
main() 函数中声明了一个 指针变量 int *p,p 是指向整型类型的地址的,所以想要修改 p 的值,就是修改 p 指向的地址。fun(p) 应修改为 fun(&p)。
B:
main()
{
int *p;
fun(&p);
...
}
int fun(int **q)
{
int s;
*q = &s;
}
第一步,取 p 地址,fun(&p);
第二步,将 s 的地址发送给 *q,*q 即 p,所以 p 指向了s 的地址。
第三步,函数 fun(&p) 执行完毕后,局部变量 int s 释放,s 没有了,p 并没有指向合法的变量。
C:
main()
{
int *p;
fun(&p);
...
}
int fun(int **q)
{
*q = (int *) malloc(4);
}
fun() 函数中 使用 malloc() 函数动态分配内存,需要我们手动释放,所以 fun() 函数执行完之后,p 指向 4 个字节依然存在,p 指向的是一个合法的变量。
D:
main()
{
int *p;
fun(p);
...
}
int fun(int *q)
{
*q = (int *) malloc(4);
}
fun(p) 没有使用取地址符,错误。
综上正确答案选 C。
小结:
A() 函数想要使用 B() 函数中的内存,B() 函数中的内存需要使用动态分配,即需要我们手动释放的内存。如果使用局部变量即静态分配的,在函数执行完成之后就会自动释放了,无法使用到其内存。
网友评论