使用2d数组时C代码出错

时间:2015-05-27 09:51:21

标签: c multidimensional-array

我正在尝试实现这个简单的代码(没有算法)。

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int l,h1,h2,h3,i,j,t,m,n;
   scanf("%d %d",&m,&n);

    int A[m][n];
    for(i=1;i<=m;i++)
       {
            for(j=1;j<=n;j++)
             scanf("%d",&A[i][j]);
       }

    int n1=m*n;
    int adj[n1][n1];
    printf("Before initialization array A =\n");
    for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
                printf("%d ",A[i][j]);
            printf("\n");

        }
    for(i=1;i<=n1;i++)
        {
          for(j=1;j<=n1;j++)
             adj[i][j]=-1;
        }
    printf("After initialization array A =\n");
    for(i=1;i<=m;i++)
        {
          for(j=1;j<=n;j++)
            printf("%d ",A[i][j]);
            printf("\n");

       }
    return 0;
}

这是我的输入文件 -

4 3 
2 3 2
2 5 1
5 3 1
3 1 1

所以这里前两个元素是m,n,即没有行和列。然后m行有n个元素。我将这些元素存储在一个二维数组A中。然后我打印出这个数组。它给出了正确的答案。然后我正在创建新的adj[m*n][m*n]。我将这个数组初始化为-1。之后我打开我的A数组前五A的元素也变为-1。我没有改变A的值。所以为什么会发生这种情况。这是我得到的输出 -

Before initialization array A =
2 3 2 
2 5 1 
5 3 1 
3 1 1 
After initialization array A =
-1 -1 -1 
-1 -1 1 
5 3 1 
3 1 1 

2 个答案:

答案 0 :(得分:2)

C使用基于0的索引。因此,数组的有效索引从0开始,以长度-1结束。

这意味着您必须修改循环。这样:

for(i=1;i<=m;i++)

并且需要

for(i=0;i<m;i++)

您需要对所有其他循环执行相同操作。否则,您将访问无效的数组索引,这会导致未定义的行为。

答案 1 :(得分:1)

您需要知道的是,在C / C ++数组中,从0开始到数组长度为-1。在for loops中更改此内容并查看会发生什么