`
923723914
  • 浏览: 634747 次
文章分类
社区版块
存档分类
最新评论

C语言中二维数组动态分配内存

 
阅读更多
最近《数据结构》看到哈夫曼树的构造一部分的程序,构造程序使用了锯齿状数组——即一种特殊二维数组,只不过每一行的长度是根据需要存放的元素个数分配的。这就涉及到二维数组内存的动态分配问题,先来看如何给一个普通的4行5列二维数组分配内存。
int **p;
int i;


if( NULL == (p = (int **)malloc(4 * sizeof(int *))) )
     return -1;


for(i = 0; i < 4; i++)
{
     if( NULL == (p[i] = (int *)malloc(5 * sizeof(int))) )
         return -1;
}
        
for(i = 0; i < 4; i++)
{
     free(p[i]);
}
free(p);


在C语言中二维数组其实是数组的数组。第5行给p分配了4个都为指向int的指针大小的内存空间(对应着二维数组的行),然后第11行分别给每行都分配5个int大小的内存空间,这些内存空间在内存中都是线性排列的。
编译器在处理如上代码时,并不是真的就给每行分配5个int大小的内存空间,在gcc 4.7.2-2中,通常会多分配一个int大小的内存空间(如下图所示)。而在VC6.0中会多分配14个。

gcc为如上代码中二维数组的内存分配情况如下图:


后来不小心在程序中写了类似与p[2][50] = 7;的代码,这段代码明显数组越界了,但编译器没有报错。一直在纠结为啥会这样,如果你看了上面那副图你就知道了,其实这时p[2][50]虽然从你分配的内存空间中"越界",此时它用的是图中最后的空白区域的某一块内存,而C语言对数组不会进行越界检查,所以编译器并没有报错。


分享到:
评论

相关推荐

    C语言 二维数组 malloc 矩阵加法 乘法 转置

    C语言 实在 矩阵的乘法 加法 转置 各个子涵数都有通用性,内存的分配是使用二维数组动态 malloc 分配

    关于c语言二维数组初始化

    C语言中的二维数组初始化可以通过以下几种方式实现: 使用花括号进行初始化:在定义二维数组时,直接使用花括号将每...使用动态内存分配进行初始化:首先为二维数组的每一行分配内存,然后再为每一行的每个元素分配内存

    C指针系列之动态申请二维数组

    使用C的二级指针动态分配二维数组,在linux和vs2010下均编译通过。

    c语言动态数组的实现方法

    该项目利用c语言的malloc函数实现了一维和二维动态数组的创建,并且二维数组采用了两种方式。该项目对了解程序的内存分配具有很好的益处。

    C语言中多维数组的内存分配和释放(malloc与free)的方法

    如果要给二维数组(m*n)分配空间,代码可以写成下面: 代码如下:char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n...

    八十多条C语言基础教程

    c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组中 c 结构体问题 c 使用winsock...

    谭浩强C语言设计第三版.pdf

     6.2.3 内存的动态分配与动态数组的建立  6.3 指针与函数  6.3.1 指针参数与函数的地址传送调用  6.3.2 带参数的主函数  6.3.3 返回指针值的函数  6.3.4 指向函数的指针  习题六 第7章 用户定制数据类型  ...

    chp6 linux.rar

     一维数组的定义、引用及初始化  一维数组的内存分配  二维数组的定义、初始化  二维数组的内存分配  字符数组  字符串的定义、输入输出  字符串处理函数

    谭浩强c语言程序设计

    7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 ...

    C语言程序设计(谭浩强)第三版

     6.2.2怎样引用二维数组的元素  6.2.3二维数组的初始化  6.2.4二维数组程序举例  6.3.字符数组 6.3.1怎样定义字符数组  6.3.2字符数组的初始化  6.3.3怎样引用字符数组中的元素  6.3.4字符串和字符串结束标志...

    谭浩强 C语言程序设计 教程全书 Word版

    7.2 二维数组的定义和引用 6 7.2.1 二维数组的定义 6 7.2.2 二维数组元素的引用 6 7.2.3 二维数组的初始化 7 7.2.4 二维数组程序举例 9 7.3 字符数组 9 7.3.1 字符数组的定义 9 7.3.2 字符数组的初始化 9 7.3.3 字符...

    谭浩强版c语言程序设计

    7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 ...

    《C语言程序设计》谭浩强

    7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 ...

    新概念C语言.李一波(带详细书签).pdf

    12.1 二维数组的定义和引用 132 12.1.1 二维数组的定义 132 12.1.2 二维数组的引用 132 12.2 二维数组的初始化 133 12.3 二维数组应用举例 134 12.4 多维数组的定义和引用 136 习题 136 第13章 选择结构 138 ...

    C语言讲义.doc

    1.1.17 二维数组名作为函数参数 58 1.1.18 const关键字保护数组内容 58 1.1.19 指针做为函数的返回值 58 1.1.20 指向函数的指针 59 1.1.21 把指向函数的指针做为函数的参数 60 1.1.22 memset,memcpy,memmove函数 61 ...

    c语言程序设计(第三版)

    7.2 二维数组的定义和引用 6 7.2.1 二维数组的定义 6 7.2.2 二维数组元素的引用 6 7.2.3 二维数组的初始化 7 7.2.4 二维数组程序举例 9 7.3 字符数组 9 7.3.1 字符数组的定义 9 7.3.2 字符数组的初始化 9 7.3.3 字符...

    C语言入门课程代码

    .txt文档教程+对应.c源代码,包括课程:数据类型,运算符,分支循环,数组,二维数组,函数,文件操作,指针,字符串,预处理,结构体,动态内存分配,查找排序,单链表,双链表,项目,C语言基础测试。

    谭浩强c语言word版

    7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 ...

    c语言(编写程序最佳参考资料)

    7.2 二维数组的定义和引用... 6 7.2.1 二维数组的定义... 6 7.2.2 二维数组元素的引用... 6 7.2.3 二维数组的初始化... 7 7.2.4 二维数组程序举例... 9 7.3 字符数组... 9 7.3.1 字符数组的定义... 9 7.3.2 ...

Global site tag (gtag.js) - Google Analytics