LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1127|回复: 8

关于二维数组的问题

[复制链接]
发表于 2002-11-17 22:38:42 | 显示全部楼层 |阅读模式
程序中要用到二维数组,但二维数组的大小要在运行时才能确定。怎样定义这个二维数组呢?

我试了下面这种办法:
int ***A;

// 用户输入数行列r,c后
for(i=0;i<r;i++)
  for(j=0;j<c;j++)
     A[j]=new int;

但还是不行。有个warning:
local variable 'A' used without having been initialized
并且运行出错!
发表于 2002-11-17 22:46:01 | 显示全部楼层
int A[][] 而且要初始化
 楼主| 发表于 2002-11-17 23:02:46 | 显示全部楼层
问题出现的前提是在运行前我是无法知道二维数组的大小的呀。
所以用A[][]初始化这种方法肯定行不通的
发表于 2002-11-18 08:54:10 | 显示全部楼层

Re: 关于二维数组的问题

在for中嵌套一个while,
把for循环的值设大一点。
发表于 2002-11-18 11:31:37 | 显示全部楼层
可以采用建立多维动态数组来解决这个问题。先定义一个函数,在定义除了第一维以外的各维大小时,可以将指针传递给这个函数,而该函数再将其参数定义成适当大小的数组。
 楼主| 发表于 2002-11-18 17:51:11 | 显示全部楼层
kj501
你可否举个例子说明一下。
就动态创建个二组。
先谢谢了!!!
发表于 2002-11-18 23:22:53 | 显示全部楼层
可以给出一个例子,这个例子将建立一个从1到10的一次方至四次方的表格。
#include <malloc.h>

/* display powers of numbers */

int main()
{
        int *p;

        p=(int *)malloc(40*sizeof(int));

        if(!P) {
                printf("memory request failed\n");
                exit(1);
        }
        /* here, p is simply a pointer */
        table(p);
        show(p);
}

table(p)
int p[4][10];/* now the compiler thinks that p is an array */
{
        register int i,j;

        for(j=1;j<11;j++)
                for(i=1;i<5;i++) p[j]=pwr(j,i);
}

show(p)
int p[4][10];
{
        register int i,j;

        printf("%10s %10s %10s %10s\n","N","N^2","N^3","N^4");
        for(j=1;j<11;j++) {
                for(i=1;i<5;i++) printf("%10d ",p[j]);
                printf("\n");
        }
}

pwr(a,b)
int a,b;
{
        register int t=1;

        for(;b;b--) t=t*a;
        return t;
}

正如这个程序显示的那样,将函数定义为所需大小的数组,即可“哄骗”C编译程序处理多维动态数组。对C编译程序而言,在函数show()和table()中确实有一个大小为4X10的数组。不同的是,数组的存储空间是由语句malloc()分配的,而不是通过一般的数组说明语句自动地得到固定大小的存储空间。但这种方法也有明显的缺点,由于不可能在编译时对数组进行检查,很容易在运行时造成数组下标越界或指针访问非法地址。如果你学过数据结构,可以采用链表来解决这个问题。你可以设计一个LNode 结构,如下所示:
struct LNode  /* 定义单链表结点 */
{
       ElemType data;     /* 数组元素 */
               int    x;      /*  数组的第一维下标 */
               int    y;      /*  数组的第二维下标 */
struct LNode  *next   /* 指向下一个结点的指针 */
}
这样把数组的下标变成链表结点结构的成员,在新增结点时只管插入就行了,完全不受数组大小的限制。只是编程要麻烦一些。
发表于 2002-11-21 17:31:26 | 显示全部楼层

应该是这样吧

int a[][];
int row;
int col;
int i;
printf("Enter row:");
scanf("%d",&row);
printf("Enter col:");
scanf("%d",&col);
for(i=0;i<row;i++)
a=new int[col];
发表于 2002-11-21 20:33:03 | 显示全部楼层

Re: 应该是这样吧

最初由 mwatt 发布
int a[][];
int row;
int col;
int i;
printf("Enter row:");
scanf("%d",&row);
printf("Enter col:");
scanf("%d",&col);
for(i=0;i<row;i++)
a=new int[col];


你能不能把程序调试通过后再贴上来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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