c语言:程序改错

下列程序在主程序中初始化一个矩形并将每个单元元素输出,然后调用子函数,分别计算每一行元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
#include<stdio.h>
void rowsum(int a[][4],int nrow)
{
for(int i=0;i<nrow;i++)
{for(int j=1;j<4;j++)
a[i][0]+=a[i][j];
}
}
void main()
{int table[3][]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};错
for(int i=0;i<3;i++)
{for(int j=0;j<=4;j++)
printf("%d ",table[i][j]);
printf("\n");
}
rowsum(table[3][4],3);错
for(i=0;i<3;i++)
printf("sum of row%d is %d \n",i,table[i][0]);
getch();
}
谢谢

int table[3][]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
修改为:
int table[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};

多维数组直接赋值时,不能省略数组的第二个下标的。

rowsum(table[3][4],3);
修改为
rowsum(table,3);

因为定义的时候
void rowsum(int a[][4],int nrow)
其中
int a[][4],其实指的就是二维数组,指针形式进入。
所以应该传入table这个首地址。

至于中间的
for(int j=0;j<=4;j++)
printf("%d ",table[i][j]);

这个地方,数组下标超了,应该是
for(int j=0;j<=3;j++)
printf("%d ",table[i][j]);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-21

问题:

1,多维数组的定义,主要是分配内存的问题。

    a[i][j]是数组的数组,意思是定义i个元素的数组,每个元素都是一个含有j个元素的数组.  注意:这里的i,j是具体的数字,不能是变量。

    a[][4]是定义了n个含有4个元素的数组,如:a[][4]={{1,2,3,4},{5,4,3,2},{6,7,8,9}}是定义了3个"含有4个元素的数组"的数组.虽然3个自定义的,但是是确定的数字。程序可以分配内存。

    a[3][]是定定义了3个"含有n个元素的数组"的数组.如:a[3][]={{1,2,3}{3,4}{5,6}},由于n的值是不确定的(如上有3个的,2个的),所以程序无法为这个数组分配内存空间.


2,对于数组下标的使用,对于一个指定下标为4的数组,他的下标是0,1,2,3,这4个,而没有4.


3,rowsum(int table[][],int nrow)

table[3][4]是一个值,你的子函数需要获得一个数组,你却传一个值,显然编译器不会答应。

在参数中直接写,table就可以将数组传入。


#include<stdio.h>
void rowsum(int a[][4],int nrow)
{
    for(int i=0;i<nrow;i++)
    {
        for(int j=1;j<4;j++)
            a[i][0]+=a[i][j];
    }
}
void main()
{
    int table[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};//多维数组的定义需要多多注意,具体看问题1
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<4;j++)
                printf("%d ",table[i][j]);
            printf("\n");
        }
        rowsum(table,3);//此处直接用table,即表示该数组
            for(i=0;i<3;i++)
                printf("sum of row%d is %d \n",i,table[i][0]);
        //  getch();
}

第2个回答  2013-05-21
#include<stdio.h>
void rowsum(int a[][4],int nrow)
{
for(int i=0;i<nrow;i++)
{for(int j=1;j<4;j++)
a[i][0]+=a[i][j];
}
}
void main()
{int table[][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};//这里table[][4];
for(int i=0;i<3;i++)
{for(int j=0;j<4;j++)//这里j<4
printf("%d ",table[i][j]);
printf("\n");
}
rowsum(table,3);//这里table
for(i=0;i<3;i++)
printf("sum of row%d is %d \n",i,table[i][0]);
getch();
}
第3个回答  2013-05-21
我看了下 错误应该是
1.二维数组的 行下标可以缺省 但是列下标不能缺
int table[3][]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};错 改为
int table[][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};对
2.你的 数组下标超界了 数组的下标调用和定义有点区别
就像 int table[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};定义的是3行4列的数组table 但是他的下标 最大才是table[2][3]因为 他每个下标都是从0开始的 不是1
所以rowsum(table[3][4],3);错 改为
rowsum(table[2][3],3);对
应该就是 这些吧
=========================以上 个人手打 长时间没接触 只做参考 希望可以帮助到你!
第4个回答  2013-05-21
数组是按行存放的所以定义数组时要知道每行要多长,这就必须定义列的长度,行的长度可以不确定。
在用数组作为函数参数(传递的是所有元素的情况)的时候,传递的是数组首地址,不能像那样写
相似回答