用malloc开辟二维数组,以及数组和指针

更新

还没加入小组以前写的博客了,今晚听欢神的技术直播,想到这篇博客了,回来更正如下

例:(动态分配一个arr[2][4]数组)

#include <stdio.h>
#include <stdlib.h>
int main() 
{
    int (*arr)[4] = (int(*)[4])malloc(sizeof(int)*8);
}

因为什么多维数组都是不存在的!实际上只存在一维数组,多维数组实际上都是为了你理解上的便利抽象出来的,什么行和列,都是抽象的产物。

多维数组本质上是元素是数组的一维数组。

所以以前理解的下面的那种代码,定义int ** 类型的arr,以及先分配行,再分配列,都是不对的。

记得free,我就不写了


以及,

int a[5] &a+1不是首地址+1,系统会认为加一个a数组的偏移,偏移一个数组的大小,原因:&a是数组指针,其类型是int (*)[5]。而指针+1要根据指针类型加上一定的值,不同类型的指针+1增加的大小不同。a是长度为5的int数组指针,所以要加上5*sizeof(int),因此得到的实际是a[5]
所以sizeof(a)返回的是整个数组的大小而不是指针的大小,我觉得是在这里将a视为对象,即整个数组

上面这段话,是以前的理解

int a[5], a是什么,
a既不是常量也不是变量,甚至不是一个“量”——没有对应的内存存储a,哪里来的“量”,它只是一个抽象的对一块内存的描述
我们 int* p = a;可以
是因为编译器做了隐式转换,
但是以下的情况下是不转换的:
做sizeof 和 & 的操作数的时候
即 sizeof(a),a不做隐式转换,表示那一整块内存,即上面所说的抽象的“对象”
所以说,&a + 1的原因也是这样


————————————————————————————————————————————————————————————————————————————

用malloc开辟一个二维数组

#include <stdio.h>  
#include <stdlib.h>  
  
int main(void)  
{  
    int i, row, column, **arr;  
  
    while (scanf("%d %d", &row, &column) != EOF) {  
        arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址  
        for (i = 0; i < row; i ++) { // 按行分配每一列  
            arr[i] = (int *)malloc(sizeof(int) * column);     
        }  
  
        // 释放开辟的二维数组空间  
        for (int i = 0; i < row; ++i)  
        {  
            free(*(arr + i));  
        }  
    }  
  
    return 0;  
}  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值