我想创建一个2D数组,其中行数和列数由命令行参数获取。然后使用动态内存分配生成数组,其中用户提供输入。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, int *argv[]) {
int **arr;
arr = (int **)malloc(*argv[1]*sizeof(int*));
for (int i=0; i<argv[1]; i++)
arr[i] = (int *)malloc (*argv[2]*sizeof(int));
for (int i=0; i<argv[1]; i++)
for (int j=0; i<argv[2]; j++)
scanf("%d", &arr[i][j]);
for (int i=0; i<argv[1]; i++){
for (int j=0; i<argv[2]; j++)
printf("%d ",arr[i][j]);
printf("n");}
return 0;
}
然而,我得到分段转储每次我运行这个。你能解释一下我哪里做错了吗?
您的main
签名不正确。参数是作为指向string的指针数组提供的,因此要获得row/col,您需要将字符串转换为int,例如使用atoi()
。
在调用scanf
时,在循环的第二部分使用i
也有错误。
我已经做了下面的更正,并添加了一些小的变化,以清晰。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int **arr;
if (argc < 3) {
printf("must supply 2 integer argumentsn");
return -1;
}
int rows = atoi(argv[1]);
int cols = atoi(argv[2]);
printf("rows=%d, cols=%dn", rows, cols);
arr = (int **)malloc(rows*sizeof(int*));
for (int i=0; i<rows; i++)
arr[i] = (int *)malloc (cols*sizeof(int));
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
printf("Value for row %d col %d: ", i+1, j+1);
scanf("%d", &arr[i][j]);
}
}
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
printf("%d ",arr[i][j]);
}
printf("n");
}
return 0;
}
使用数组指针
int main(int argc, char *argv[])
{
int rows = atoi(argv[1]);
int cols = atoi(argv[2]);
int (*arr)[cols] = malloc(rows * sizeof(*arr));
}