搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 641|回复: 10
收起左侧

请教多维数组动态空间开辟的问题

[复制链接]

该用户从未签到

4

主题

16

好友

2768

积分

Continue

积分
2768
发表于 2013-6-4 15:54:49 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
int **a,i;
int m,n;
a=(int**)malloc(m*sizeof(int));                               
for(i=0;i<m;i++)
        a[i]=(int*)malloc(n*sizeof(int));       

就是老师要我们设计个程序中,涉及到很多未知大小的数组,是不是可以把上面的代码放到自定的函数中去,通过调用来实现动态空间的开辟。
主要是数组太多,我不想一个一个的开辟,想就通过m,n赋值后直接实现。
请大神指教啊!!
如果不可以放在函数里【貌似是不可以,直接放进去,我试运行了下,出错了额
那有什么办法实现我说的,通过赋值m,n,然后调用函数来开辟的。
额  说的有点乱  请谅解       
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

3

主题

37

好友

1万

积分

第一章

积分
11825
发表于 2013-6-4 21:54:29 | 显示全部楼层
应该没啥不可以啊。。。函数返回指针就行了啊
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-6-5 18:24:30 | 显示全部楼层
a=(int**)malloc(m*sizeof(int*));  
剩下的没什么了
返回int**,最后记得别忘了free,而且要每个a [i]都要free
等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

16

好友

2768

积分

Continue

积分
2768
 楼主| 发表于 2013-6-8 21:41:38 | 显示全部楼层

那不就只有一个m变量了吗?我要的是二维数组额
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

36

好友

2780

积分

Continue

积分
2780
发表于 2013-6-9 00:06:50 | 显示全部楼层
1. 你说不能放函数里,是因为你没正确地传参数进去,或者没正确地传参数回来。
2. 在这段code里,a=(int**)malloc(m*sizeof(int));  是不对的,里面应该是m*sizeof(int*),注意区别。
3. 记得写一个对应释放空间的函数~

评分

参与人数 1宅币 +10 收起 理由
风音洛洛 + 10

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-6-9 01:16:06 | 显示全部楼层
伊冯_等末子 发表于 2013-6-8 21:41
那不就只有一个m变量了吗?我要的是二维数组额

你这样做的a,里面存的是指向数组的指针,所以m为数组个数,然后n是每个数组的大小,这样就可以定义出一个二维数组了,举个例子:
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
int main(){
    int **a = NULL;
    a = (int**)malloc(10 * sizeof(int*));
    int i = 0, j = 0;
    for(i = 0; i < 10; i++){
        a = (int*)malloc((i + 1) * sizeof(int));
    }
    for(i = 0; i < 10; i++){
        for(j = 0; j < i + 1; j++){
            a[j] = i;
        }
    }
    for(i = 0; i < 10; i++){
        for(j = 0; j < i + 1; j++){
            printf("%d ", a[j]);
        }
        printf("\n");
    }
}
[/mw_shl_code]

评分

参与人数 1宅币 +10 收起 理由
风音洛洛 + 10 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

11

好友

1323

积分

Continue

积分
1323
发表于 2013-6-9 21:43:53 | 显示全部楼层
其实问题很多    你开的只是一个指向指针的指针数组   和二维数组没啥关系  你想想   如果而二维数组  num[2][2];
num[0]  中就有两个数字   而你开辟的空间    每个指针都是指向一个指针   而如果又要像二维数组那样   就要把指针指向一个科储存多个元素的指针   

评分

参与人数 1宅币 +8 收起 理由
风音洛洛 + 8

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

11

好友

1323

积分

Continue

积分
1323
发表于 2013-6-9 21:45:09 | 显示全部楼层
所以还要再开辟空间     用指针指向新的空间
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

好友

3676

积分

序章

积分
3676
发表于 2013-6-26 02:21:01 | 显示全部楼层
好像遇到这个应该考虑足够大,分配正好大小的数组···不知道能不能实现。(拙见)
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

3

主题

12

好友

7526

积分

LOLI控

积分
7526
发表于 2013-7-7 11:42:10 | 显示全部楼层
你要知道,多维数组也无非是编译器的语法糖而已。
所以实际上你可以alloc一大片内存放数据,然后再alloc一片内存放指针数组,再把指针指过去。
事实上,正常情况下是要避免多维数组的,因为出现这个东西基本代表设计不良。
类啊,结构体啊,许多东西可以避免多维数组出现。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

好友

1863

积分

Continue

积分
1863
发表于 2013-7-8 15:46:46 | 显示全部楼层
当然可以
[mw_shl_code=c,true]int** alloc_memory_for_2D_array(int m, int n){
    int **ptr;
    int i;
   
    ptr = (int **)malloc(m*sizeof(int *));
    for (i=0; i<m; i++){
        ptr = (int *)malloc(n*sizeof(int));
    }
   
    return ptr;
}[/mw_shl_code]

例子:
[mw_shl_code=c,true]int **array_2d;
const int width = 10;
const int height = 20;
array_2d = alloc_memory_for_2D_array(height, width);
if (array_2d == NULL){
    printf("Fail to allocate memory.");
}[/mw_shl_code]
一定不要忘记检查分配是否成功

最后还要有个函数负责free
[mw_shl_code=c,true]void free_memory_for_2D_array(int **ptr, int m){
    int i;
   
    for (i=0; i<m; i++){
        if (ptr){
            free(ptr);
            ptr = NULL;
        }
    }
    if (ptr){
        free(ptr);
        ptr = NULL;
    }
}[/mw_shl_code]
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-1 23:43 , Processed in 0.161671 second(s), 37 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表