C语言之内存分配例题详解
2014-07-09 22:01
323 查看
1、C中内存分为四个区
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一 直占着不放,导致内存泄露。
全局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
例1. 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。
int n; //类型定义的都是在栈区
scanf("%d",&n);
int a[] = {0};
int *p;
p = a;
p = malloc(n*sizeof(int)); //在堆区分配内存(分配方式:数组元素个数*类型字节长度)
for (int i = 0; i < n; i++) {
*(p+i)= arc4random()%10+1;
}
int max = 0;
for (int j = 0; j < n; j++) {
if (max < *(p+j)) {
max = *(p+j);
}
}
printf("%d\n",max);
free(p); //最后不要忘了释放内存
例2. [b] 已知一个数组20个元素(随机1到100之间包含1和100),求大于平均数的元素个数,并动态生成一个新数组保存(提示:malloc出20个元素保存)int a[20] = {0};
int sum = 0;
for (int i = 0; i < 20; i++) {
a[i] = arc4random()%100+1; //随机分配20个(1,100)的随机数
sum = sum + a[i];
}
int b[20];
int avg = 0;
int *p;
p = b;
p = malloc(20*sizeof(int)); //[b]在堆区分配内存(分配方式:数组元素个数*类型字节长度)
avg = sum/[/b]20;
int k = 0;
for (int j = 0; j < 20; j++) {
if (a[j] > avg) {
*(p+k) = a[j];
k++;
}
}
for (int i = 0; i < k; i++) {
printf("%d\n",*(p+i));
}
free(p); [b]//最后不要忘了释放内存[/b][/b]
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一 直占着不放,导致内存泄露。
全局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
例1. 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。
int n; //类型定义的都是在栈区
scanf("%d",&n);
int a[] = {0};
int *p;
p = a;
p = malloc(n*sizeof(int)); //在堆区分配内存(分配方式:数组元素个数*类型字节长度)
for (int i = 0; i < n; i++) {
*(p+i)= arc4random()%10+1;
}
int max = 0;
for (int j = 0; j < n; j++) {
if (max < *(p+j)) {
max = *(p+j);
}
}
printf("%d\n",max);
free(p); //最后不要忘了释放内存
例2. [b] 已知一个数组20个元素(随机1到100之间包含1和100),求大于平均数的元素个数,并动态生成一个新数组保存(提示:malloc出20个元素保存)int a[20] = {0};
int sum = 0;
for (int i = 0; i < 20; i++) {
a[i] = arc4random()%100+1; //随机分配20个(1,100)的随机数
sum = sum + a[i];
}
int b[20];
int avg = 0;
int *p;
p = b;
p = malloc(20*sizeof(int)); //[b]在堆区分配内存(分配方式:数组元素个数*类型字节长度)
avg = sum/[/b]20;
int k = 0;
for (int j = 0; j < 20; j++) {
if (a[j] > avg) {
*(p+k) = a[j];
k++;
}
}
for (int i = 0; i < k; i++) {
printf("%d\n",*(p+i));
}
free(p); [b]//最后不要忘了释放内存[/b][/b]
相关文章推荐
- C语言中的动态内存分配详解
- c语言常用内存分配函数详解
- 深入C语言内存区域分配(进程的各个段)详解(转)
- 深入C语言内存区域分配(进程的各个段)详解
- C语言内存分配情况详解
- C语言动态内存分配的详解
- C语言中的内存分配实例详解
- C语言:内存字节对齐详解
- C语言:内存字节对齐详解[转载]
- Java 内存分配及String类型详解
- C语言内存分配疑问及相关回答
- 内存分配详解、指针与数组[C++][内存管理]
- C语言:内存字节对齐详解
- C++内存管理之内存分配详解
- 内存分配详解、指针与数组[C++][内存管理]
- C++内存分配秘籍—new,malloc,GlobalAlloc详解
- C语言内存分配问题和 C语言中的内存对齐
- C语言内存分配基础知识
- 链表的C语言实现(含动态内存分配)
- C语言内存分配问题和C语言中的内存