C语言中的内存分配深入
这里不讲解c语言的内存分配怎么使用,只说要注意的问题。我们借用一下c++的,先看一个c++的内存分配:
#include<iostream>
usingnamespacestd;
structcpp_Format
{
floatpData[5];
};
cpp_Format**c_pp;
intmain()
{
inti;
c_pp=newcpp_Format*[10];
for(i=0;i<10;i++)
c_pp[i]=newcpp_Format[20];
for(i=0;i<10;++i)
delete[]c_pp[i];
delete[]c_pp;
return0;
}
那我们模仿一下,把他做成c语言的样子:
#include<stdlib.h>
#include<stdio.h>
intmain(void)
{
int*p1=(int*)malloc(10);
free(p1);
int**p=NULL;
p=(int**)malloc(10);
for(inti=0;i<10;i++){
p[i]=(int*)malloc(10);
}
for(inti=0;i<10;i++){
free(p[i]);
}
free(p);
}
问题就出来,上面的程序编译起来没有问题,运行起来问题就大了。其实我们要知道,c++里面比如:
c_pp = new cpp_Format* [10];
这个10表示分配10个cpp_Format对象需要的空间。
再看看
int *p1 = (int *)malloc(10)
真正理解malloc的就晓得,这个不是分配10个对象空间,仅仅是分配10个字节。
那么10字节分配之后p1怎么用,从p[0]到p[9]?明显不是,一个int占4个字节,10个就是两个半int,哈哈这个就不好用了,p[0]到p[1.5]?无语!
再看:
int**p=NULL;
p=(int**)malloc(10);
for(inti=0;i<10;i++){
p[i]=(int*)malloc(10);
}
这个东西就有意思了,**p是10个字节,一个int *占4个字节,那么同样10/4之后就肯定没有10个分配好的指针,之所以编译不出错,是因为指针偏移不会越界。
p[i] = (int *)malloc(10);
这个也是问题,用p[i][2]有多用p[i][3]又不够!
其实解决方法很简单:不要偷懒!
修改如下:
#include<stdlib.h>
#include<stdio.h>
intmain(void)
{
int*p1=(int*)malloc(10*sizeof(int));
free(p1);
int**p=NULL;
p=(int**)malloc(10*sizeof(int*));
for(inti=0;i<10;i++){
p[i]=(int*)malloc(10*sizeof(int));
}
for(inti=0;i<10;i++){
free(p[i]);
}
free(p);
}
C和c++内存分配那个更好,不好说,实现的问题。
分享到:
相关推荐
C语言动态内存分配函数详细的解析,带实例和程序片段,有助于深入理解!
c语言内存分配 了解真正的c语言内存分配情况 对c语言的理解更加深入··
主要深入地介绍了C语言中的内存分配,C语言编程中的内存泄漏问题一直以来都是C编程中的一大棘手问题,本文从malloc和指针等方面对C内存进行了深层次讲解,强烈推荐!需要的朋友可以参考下
C语言各数据类型内存分配精讲,深入剖析各数据类型的内存分配
一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成...
涉及的知识面广,从内存分配,到串行、并行口编程,再到界面开发、动画和高级应用,几乎涵盖了C语言编程的方方面面。通过对本书的学习,对C语言的高级编程将有一个深刻的理解和掌握,而不仅局限于简单的数据结构和...
C语言常见问题集-超清中文翻译版,特别适合想深入理解C语言的人,里面详细解释了C语言指针、内存分配、库函数等C语言深刻问题,帮助新手快速理解C语言
除此之外,我们还将介绍C语言中的文件操作和动态内存分配,这些功能在实际编程中非常重要。我们将详细讲解如何打开和关闭文件、如何读写文件、如何定位文件指针等等。此外,我们还将介绍如何使用动态内存分配函数来...
涉及的知识面广,从内存分配,到串行、并行口编程,再到界面开发、动画和高级应用,几乎涵盖了C语言编程的方方面面。通过对本书的学习,对C语言的高级编程,将育一个深刻的理解和掌握,而不仅局限于简单的数据结构和...
作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...
作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...
作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...
内存管理:动态内存分配(malloc、calloc、realloc、free)。 文件操作:文件的打开、读写、关闭。 预处理器:宏定义、文件包含、条件编译。 C语言标准库:标准库函数的使用。 数据结构和算法:链表、栈、队列、排序...
7.4.1 动态内存分配:malloc()函数 260 7.4.2 分配内存时使用sizeof运算符 261 7.4.3 用calloc()函数分配内存 265 7.4.4 释放动态分配的内存 265 7.4.5 重新分配内存 267 7.5 使用指针处理字符串 268 7.5.1 ...
内容涉及C语言的基本结构、数据类型、变量和常量、运算符、控制语句、函数、数组、指针、结构体和联合体等基础概念,以及动态内存分配、递归、指针算术、位操作等高级话题。 **适用人群:** 本指南适合所有准备参加...
1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数...
作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...