为多级指针分配内存
2014-08-21 22:55
232 查看
如何理解多级指针
1. 当指针做函数参数的时候,要站在编译器的角度去理解,他只不过是4个字节的变量。 2. 当我们使用指针所指向的内存空间的时候,我们才去关注char * /char ********是二维的,还是八维的。指针变量和它所指向的内存空间变量是两个不同的概念。 |
为一级指针分配内存
方法1:由返回值传回分配的地址
看例程 |
char *GetCharMem(unsigned int n) { char *s; s = (char *)malloc(sizeof(char)*n); return s; } int main() { char *s = NULL; s = GetCharMem(sizeof(char)*5); *s = 'a'; printf("%c\n",*s); free(s); s = NULL; getchar(); return 0; } |
|
上面的函数只能为char *分配内存,可以将其改成为各种类型的指针分配内存,如下所示。 |
void *GetMem(unsigned int n) { void *s; s = (void *)malloc(n); return s; } int main() { char *s = NULL; int *p1 = NULL; float *p2 = NULL; s = (char *)GetMem(sizeof(char)); p1 = (int *)GetMem(sizeof(int)); p2 = (float *)GetMem(sizeof(float)); *s = 'b'; *p1 = 3; *p2 = 4; printf("%c\n",*s); printf("%d\n",*p1); printf("%f\n",*p2); free(s); s = NULL; free(p1); p1 = NULL; free(p2); p2 = NULL; getchar(); return 0; } |
其实上面的函数GetCharMem()和GetMem()相当于是为malloc()换了一层躯壳,并没有多大意义。 |
方法2:通过二级指针做形参间接分配内存
看例程 |
int GetCharMem(char **p, unsigned int n) { if(p == NULL || n == 0) { return -1; } *p = (char *)malloc(sizeof(char)*n); if(*p == NULL) { return -2; } return 0; } int main() { int rv = 0; char *s = NULL; rv = GetCharMem(&s,5); if(rv != 0) { //各种操作 } *s = 'a'; printf("%c\n",*s); free(s); s = NULL; return 0; } |
|
上面的函数只能为char *分配内存,可以将其改成为各种类型的指针分配内存,如下所示。 |
int GetMem(void **p, unsigned int n) { if(p == NULL || n == 0) { return -1; } *p = (void *)malloc(n); if(*p == NULL) { return -2; } return 0; } int main() { char *s = NULL; int *p1 = NULL; float *p2 = NULL; GetMem(&s, sizeof(char)*5); GetMem(&p1, sizeof(int)*5); GetMem(&p2, sizeof(float)*5); *s = 'c'; *p1 = 11; *p2 = 12; printf("%c\n",*s); printf("%d\n",*p1); printf("%f\n",*p2); free(s); s = NULL; free(p1); p1 = NULL; free(p2); p2 = NULL; return 0; } |
为多级指针分配内存
关于为二级指针分配内存在“二级指针的第三种内存模型/二级指针第三种内存模型的一般应用步骤”中也有所提及,不过那种方法是由返回值传回分配的地址,也可以通过三级指针做形参间接分配内存。原理都与一级指针类似,这里就不多说了。相关文章推荐
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 深入理解C指针学习笔记---多级指针的内存分配问题(五)
- 内存分配指针相关1
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- C\C++指针(地址)学习总结(附内存分配方式)
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
- 动态内存分配和指针
- 使用malloc分别分配2KB,6KB的内存空间,打印指针地址
- C\C++中结构体变量与结构体指针内存分配问题
- C语言 内存分配 地址 指针 数组 参数 实例解析 (C语言复习)
- 数据结构基础:指针及动态内存分配(malloc)
- 学点 C 语言(23): 数据类型 - 给指针分配内存
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 字符指针与字符数组内存分配的区别
- C++编程入门系列之三十二(数组、指针和字符串:动态内存分配和释放)
- 娓娓道来c指针 (2)内存分配
- 改变指针指向的字符内容、动态分配字符型指针变量内存空间
- C语言编程基础-16动态内存分配 二级指针做形参 函数指针
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用