学点 C 语言(23): 数据类型 - 给指针分配内存
2008-11-28 11:09
537 查看
C 语言的内存分配很简单: malloc、calloc、realloc、free
malloc(字节数); 返回内存段的首地址, void 的.
calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空.
realloc(原指针, 字节数); 重新分配由 malloc、calloc 分配的内存; 这里有太多注意事项:
1、如果缩小了, 会截掉一块, 会保留前面的内容;
2、如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化;
3、在扩大时, 有可能内存地址会变化, 这样原来的指针就废了, 不过返回值是新指针, 所以继续使用的应该是返回值.
如果分配失败会返回 NULL, 一般是因为内存不足; 分配 0 字节内存也会返回 NULL 但这没有意义.
它们都是用 free(指针) 释放.
1. 给一个整数分配内存:
2. 给 3 个整数分配内存:
3. 像数组一样使用:
4. calloc 会同时初始化内存, malloc 则不会, 不初始化应该更快些:
5. realloc:
6. 判断内存是否分配成功:
malloc(字节数); 返回内存段的首地址, void 的.
calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空.
realloc(原指针, 字节数); 重新分配由 malloc、calloc 分配的内存; 这里有太多注意事项:
1、如果缩小了, 会截掉一块, 会保留前面的内容;
2、如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化;
3、在扩大时, 有可能内存地址会变化, 这样原来的指针就废了, 不过返回值是新指针, 所以继续使用的应该是返回值.
如果分配失败会返回 NULL, 一般是因为内存不足; 分配 0 字节内存也会返回 NULL 但这没有意义.
它们都是用 free(指针) 释放.
1. 给一个整数分配内存:
#include <stdio.h> #include <stdlib.h> int main(void) { int *p = NULL; // p = malloc(sizeof(int)); /* 应该像下一句同时类型转换, 不然在 C++ 里面不行 */ p = (int *)malloc(sizeof(int)); *p = 100; printf("%d\n", *p); free(p); getchar(); return 0; }
2. 给 3 个整数分配内存:
#include <stdio.h> #include <stdlib.h> int main(void) { int *p = NULL; p = (int *)malloc(sizeof(int)*3); *p = 111; *(p+1) = 222; *(p+2) = 333; printf("%d,%d,%d\n", *p, *(p+1), *(p+2)); free(p); getchar(); return 0; }
3. 像数组一样使用:
#include <stdio.h> #include <stdlib.h> int main(void) { int *p = (int *)malloc(sizeof(int)*3); p[0] = 111; p[1] = 222; p[2] = 333; printf("%d, %d, %d\n", p[0], p[1], p[2]); free(p); getchar(); return 0; }
4. calloc 会同时初始化内存, malloc 则不会, 不初始化应该更快些:
#include <stdio.h> #include <stdlib.h> int main(void) { const int num = 10; // calloc 和 malloc 参数也有点区别 long *p1 = (long *)calloc(num, sizeof(long)); /* 会初始化 */ long *p2 = (long *)malloc(num * sizeof(long)); /* 不会初始化 */ int i; for (i = 0; i < num; i++) { printf("%d, %d\n", p1[i], p2[i]); } free(p1); free(p2); getchar(); return 0; }
5. realloc:
#include <stdio.h> #include <stdlib.h> int main(void) { int num = 10; int i; long *p = (long *)malloc(num * sizeof(long)); printf("内存地址: %p\n~~~~~~~~\n", p); for (i = 0; i < num; i++) p[i] = i+1; for (i = 0; i < num; i++) printf("%d\n", p[i]); printf("------------------\n"); num = 4; p = (long *)realloc(p, num*sizeof(long)); printf("内存地址: %p\n~~~~~~~~\n", p); for (i = 0; i < num; i++) printf("%d\n", p[i]); printf("------------------\n"); num = 20; p = (long *)realloc(p, num*sizeof(long)); printf("内存地址: %p\n~~~~~~~~\n", p); for (i = 0; i < num; i++) printf("%d\n", p[i]); free(p); getchar(); return 0; }
6. 判断内存是否分配成功:
#include <stdio.h> #include <stdlib.h> int main(void) { int *p = (int *)malloc(100); if (p != NULL) printf("分配成功!\n"); if (p) printf("分配成功!\n"); if (p == NULL) printf("内存不足!\n"); if (!p) printf("内存不足!\n"); free(p); getchar(); return 0; }
相关文章推荐
- 浅谈C,C++语言的基本数据类型的内存分配和指针的内存分配
- Linux设备驱动程序学习之数据类型与内存分配 .
- 程序设计基石与实践系列之类型提升、内存分配,数组转指针、打桩和矢量变换
- java基本数据类型内存分配
- 关于内存和指针操作,数据类型转换本质的理解
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- 类是数据类型,对象是内存的具体分配
- 深入理解数据类型、变量类型属性、内存四区和指针
- 学点 C 语言(25): 数据类型 - 结构数组与结构指针
- C语言指针传递和内存分配
- 类是数据类型,对象是内存的具体分配
- C++虚拟继承中_对象内存的分布_虚继承会多余分配虚表v-tab的指针vptr_图1-1清楚的描述了虚继承类对象内存的分布_转载淘宝共享数据平台
- 从内存和内存的分区的角度来理解数据类型 、变量、指针。
- 数组的概述,内存分配,两种数据类型的对比
- 学点 C 语言(20): 数据类型 - 指针
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
- Java语言中:float数据类型在内存中是怎么存储的?
- js笔记--js数据类型与内存分配(杂记)
- c语言数据类型 之 内存对齐与位段
- 学点 C 语言(22): 数据类型 - 多维数组与指针