动态内存可以跨函数使用示例
# include <stdio.h> # include <malloc.h> void f(int ** q) { *q = (int *)malloc(sizeof(int)); //sizeof(数据类型) 返回值是该数据类型所占的字节数 //等价于 p = (int *)malloc(sizeof(int)); //q = 5; //error //*q = 5; //p = 5; **q = 5; //*p = 5; } int main(void) { int * p; f(&p); printf("%d ", *p); return 0; }
有问题的(静态变量不能跨函数使用,以为一个函数执行完毕,他的空间将会被释放):
1 # include <stdio.h> 2 3 void f(int ** q) //q是个指针变量,无论q是什么类型的指针变量,都只占4个字节 4 { 5 int i = 5; 6 //*q等价于p q和**q都不等价于p 7 //*q = i; //error 因为*q = i; 等价于 p = i; 这样写是错误的 8 *q = &i; // p = &i; 9 } 10 11 int main(void) 12 { 13 int *p; //13行 14 15 f(&p); 16 printf("%d ", *p); //16行 本语句语法没有问题,但逻辑上有问题 , i 的空间已经被释放 17 18 return 0; 19 }
3、下程序中,能够通过调用函数fun,使main函数中的指针变量p指向一个合法的整型单元的是
A) main()
{ int *p;
fun(p);
…
}
int fun(int *p)
{ int s;
p=&s;
}
B) main()
{ int *p;
fun(&p);
…
}
int fun(int **q)
{ int s;
*q=&s;
}
C) #include <stdlib.h>
main()
{ int *p;
fun(&p);
…
}
int fun(int **q)
{ *q=(int *)malloc(4);
}
D)
#include <stdlib.h>
main()
{ int *p;
fun(p);
…
}
int fun(int *p)
{ p=(int *)malloc(sizeof(int));
}
2003年4月45题
注释: 这个题很有意思。考查了:
1) 指针的指针的使用 2) 动态内存分配与自动变量的内存分配。
动态分配的内存必须调用free()函数才能释放,而自动变量一旦跳出它的代码作用范围,就会由编译器自动释放掉。
让我们先看:
A) 选项无论fun()中p的值如何变化,都不会影响到主函数中p的值,因为它是值传递
B) 选项倒是把p的地址&p传递给了fun()函数,但遗憾的是,由于s是个自动变量,当推出fun()函数后,s变量所占内存单元会被会被释放掉,此时主函数中的p还是没法指向一个合法的int型单元
C) 选项fun()的形参 int **p;表明p是个指向指针变量的指针变量,即是个指针的指针。 而主函数中的 int *p; 表明p只是个指针变量,但&p则指向了p,&p也是个指向指针变量p的指针变量,实参和形参类型一致。 fun()的功能是使实参p指向了一个int型变量, 又由于该int型变量是由malloc()动态分配的,所以推出fun()函数并不会影响实参p的指向, 故C是对
D) 选项犯了和A同样的错误。 真想不到二C还会考到这个知识,哈哈!