`
pleasetojava
  • 浏览: 703327 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

C语言中的内存分配深入(一)

阅读更多

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表示分配10cpp_Format对象需要的空间。

再看看

int *p1 = (int *)malloc(10)

真正理解malloc的就晓得,这个不是分配10个对象空间,仅仅是分配10个字节。

那么10字节分配之后p1怎么用,从p[0]p[9]?明显不是,一个int4个字节,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);
}

这个东西就有意思了,**p10个字节,一个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);
}

Cc++内存分配那个更好,不好说,实现的问题。

分享到:
评论

相关推荐

    C语言动态内存分配函数解析

    C语言动态内存分配函数详细的解析,带实例和程序片段,有助于深入理解!

    c语言内存分配

    c语言内存分配 了解真正的c语言内存分配情况 对c语言的理解更加深入··

    深入解析C语言中的内存分配相关问题

    主要深入地介绍了C语言中的内存分配,C语言编程中的内存泄漏问题一直以来都是C编程中的一大棘手问题,本文从malloc和指针等方面对C内存进行了深层次讲解,强烈推荐!需要的朋友可以参考下

    C语言各数据类型内存分配精讲

    C语言各数据类型内存分配精讲,深入剖析各数据类型的内存分配

    深入C语言内存区域分配(进程的各个段)详解

    一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)和BSS段。这3个部分一起组成...

    C语言高级实例解析

    涉及的知识面广,从内存分配,到串行、并行口编程,再到界面开发、动画和高级应用,几乎涵盖了C语言编程的方方面面。通过对本书的学习,对C语言的高级编程将有一个深刻的理解和掌握,而不仅局限于简单的数据结构和...

    C语言常见问题集-超清中文翻译版

    C语言常见问题集-超清中文翻译版,特别适合想深入理解C语言的人,里面详细解释了C语言指针、内存分配、库函数等C语言深刻问题,帮助新手快速理解C语言

    现代C语言核心特性解析,C语言编程与宠物狗互动案例分析.pdf

    除此之外,我们还将介绍C语言中的文件操作和动态内存分配,这些功能在实际编程中非常重要。我们将详细讲解如何打开和关闭文件、如何读写文件、如何定位文件指针等等。此外,我们还将介绍如何使用动态内存分配函数来...

    C语言高级实例解析光盘

    涉及的知识面广,从内存分配,到串行、并行口编程,再到界面开发、动画和高级应用,几乎涵盖了C语言编程的方方面面。通过对本书的学习,对C语言的高级编程,将育一个深刻的理解和掌握,而不仅局限于简单的数据结构和...

    你必须知道的495个C语言问题

    作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    你必须知道的495个C语言问题(完整版)

    作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    你必须知道的495个C语言问题.pdf

    作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    C语言入门经典(第4版)--源代码及课后练习答案

    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 ...

    2024新版c语言基础知识点,全新内容c语言基础知识点

    内容涉及C语言的基本结构、数据类型、变量和常量、运算符、控制语句、函数、数组、指针、结构体和联合体等基础概念,以及动态内存分配、递归、指针算术、位操作等高级话题。 **适用人群:** 本指南适合所有准备参加...

    C语言程序设计标准教程

    1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数...

    你必须知道的495个C语言问题清晰中文版PDF

    作者在网络版C FAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

Global site tag (gtag.js) - Google Analytics