如何在使用之前初始化数组元素?

时间:2012-02-03 11:28:07

标签: c arrays initialization

我必须编写一个程序来说明带有数组和函数的指针的用法。

#include <stdio.h>
#include <conio.h>

#define ROWS 3
#define COLS 4

void print(int rows, int cols, int *matrix);

void main(void)
{
    int a[ROWS*COLS],i;
   for(i=0;i<ROWS*COLS;i++)
   {
        a[i]=i+1;
   }
   print(ROWS,COLS,a);
    getch();
}

void print(int rows, int cols, int *matrix)
{
    int i,j,*p=matrix;
    for(i=0;i<rows;i++)
   {
    for(j=0;j<cols;j++)
      {
        printf("%3d",*(p+(i*cols)+j));
      }
      printf("\n");
   }
}

上述程序打印一个预定义行和列的矩阵。我想修改程序,以便用户输入行和列。

#include <stdio.h>
#include <conio.h>

void print(int rows, int cols, int *matrix);

void main(void)
{
    int ROWS,COLS,a[ROWS*COLS],i;
   printf("Enter the number of rows: ");
   scanf("%d",ROWS);
   printf("\nEnter the number of columns: ");
   scanf("%d",COLS);
   for(i=0;i<ROWS*COLS;i++)
   {
        a[i]=i+1;
   }
   print(ROWS,COLS,a);
    getch();
}

void print(int rows, int cols, int *matrix)
{
    int i,j,*p=matrix;
    for(i=0;i<rows;i++)
   {
    for(j=0;j<cols;j++)
      {
        printf("%3d",*(p+(i*cols)+j));
      }
      printf("\n");
   }
}

此程序在声明变量ROWS和COLS之前发出错误。如何解决这个问题。

4 个答案:

答案 0 :(得分:5)

一种选择是在堆上分配a

int main(void)
{
   int rows,cols,*a,i;
   printf("Enter the number of rows: ");
   scanf("%d",&rows);
   printf("\nEnter the number of columns: ");
   scanf("%d",&cols);
   a = malloc(rows*cols*sizeof(int));
   for(i=0;i<rows*cols;i++)
   {
        a[i]=i+1;
   }
   print(rows,cols,a);
   getch();
   free(a);
}

另请注意我:

  1. 添加了scanf()来电中遗漏的&符号;
  2. main()的返回类型更改为int。请参阅What are the valid signatures for C's main() function?
  3. 正如您为什么代码无效:

    传统上,C需要数组边界的常量表达式。当ROWSCOLS是常量时,您的代码一切都很好。将它们变为变量后,a变为variable-length array。问题是数组的大小是在声明数组的位置计算的,此时ROWSCOLS的值还不知道。

    在C99中,可以通过推送a声明来修复代码:

    int main(void)
    {
       int rows,cols,i;
       printf("Enter the number of rows: ");
       scanf("%d",&rows);
       printf("\nEnter the number of columns: ");
       scanf("%d",&cols);
       int a[rows*cols];
       for(i=0;i<rows*cols;i++)
       {
            a[i]=i+1;
       }
       print(rows,cols,a);
       getch();
    }
    

答案 1 :(得分:1)

   printf("Enter the number of rows: ");
   scanf("%d",&ROWS);
   printf("\nEnter the number of columns: ");
   scanf("%d",&COLS);

答案 2 :(得分:0)

您应该在获得rowscols后声明数组 - 否则就没有意义了。

int rows,cols;
scanf("%d %d",&rows,&cols);
int a[rows*cols];

顺便说一下,main应返回int(如果程序成功结束,则为0)

答案 3 :(得分:0)

  1. 您需要动态分配数组 - 使用malloc
  2. scanf("%d", &ROWS); - 请注意& - scanf需要地址。