我必须编写一个程序来说明带有数组和函数的指针的用法。
#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之前发出错误。如何解决这个问题。
答案 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);
}
另请注意我:
scanf()
来电中遗漏的&符号; main()
的返回类型更改为int
。请参阅What are the valid signatures for C's main() function? 正如您为什么代码无效:
传统上,C需要数组边界的常量表达式。当ROWS
和COLS
是常量时,您的代码一切都很好。将它们变为变量后,a
变为variable-length array。问题是数组的大小是在声明数组的位置计算的,此时ROWS
和COLS
的值还不知道。
在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)
您应该在获得rows
和cols
后声明数组 - 否则就没有意义了。
int rows,cols;
scanf("%d %d",&rows,&cols);
int a[rows*cols];
顺便说一下,main
应返回int
(如果程序成功结束,则为0)
答案 3 :(得分:0)
malloc
scanf("%d", &ROWS);
- 请注意&
- scanf
需要地址。