这是我的代码 - 我将自己的值(1或0)初始化为定义的矩阵。 而不是始终设置硬编码矩阵我希望用户设置值和矩阵的dimantions scanf(“%d%d”,& height,& width); 并且在构建矩阵之后,可以使用它的值 scanf(“%d”,& vall);
请帮助我,我从来没有做过动态的这种方式,不知道如何直接从用户加载动态值的dynamix矩阵,请告诉我你的语法,这样我就可以学习。
printf("How many Row : ");
scanf("%d", &nrow);
rowptr = malloc(sizeof(int) * nrow);
printf("How many Column : ");
scanf("%d", &ncol);
谢谢
#include <stdio.h>
#define WIDTH 50
#define HEIGHT 20
void init(int board[][WIDTH], int rows) {
int x, y;
for (y = 0; y < rows; y++)
for (x = 0; x < WIDTH; x++)
board[y][x] = 0;
/* Scatter some live cells: */
board[10][25] = 1;
board[10][26] = 1;
board[10][27] = 1;
board[11][25] = 1;
board[12][26] = 1;
}
答案 0 :(得分:2)
您可以使用malloc()
功能。 malloc()
将字节数作为参数,并在成功时返回void
指针。您需要将其强制转换为适当数据类型的指针才能使用它。这是一个例子:
int **board;
scanf("%d %d", &height, &width);
// first allocate memory for pointer to each row
board = (int**) malloc(height * sizeof(int*));
// then allocate memory for each row
for(i = 0; i < height; i++)
board[i] = (int*) malloc(width * sizeof(int));
当你完成后,释放分配的内存以避免内存泄漏。你必须以相反的顺序释放它们:
// first free up each row
for(i = 0; i < height; i++)
free(board[i]);
// then free up the pointers to the rows
free(board);
修改强>
对于您的代码,请执行以下操作:
printf("How many Row : ");
scanf("%d", &nrow);
rowptr = (int**) malloc(sizeof(int) * nrow);
printf("How many Column : ");
scanf("%d", &ncol);
for(i = 0; i < nrow; i++)
rowptr[i] = (int*) malloc(ncol * sizeof(int));
答案 1 :(得分:1)
您必须使用malloc()函数以动态方式分配内存。它返回指向所请求大小的内存块的指针。这是一个例子:
int size;
int *foo;
printf("How many elements? ");
scanf("%d", &size);
foo = malloc(size * sizeof(int));
// always check if the call succeeded
if(foo == NULL) {
printf("can't allocate memory!");
return;
}
int i;
for(i = 0; i < size; i++) {
printf("enter value for element #%d: ", i + 1);
scanf("%d", &foo[i]);
}
// ...
free(foo); // to avoid memory leaks
free()告诉操作系统您传入的块不再使用,因此它可用于将来。
现在,由于你需要一个矩阵,你需要一个双指针,你必须为每个“行”调用malloc(为清楚起见,删除了错误检查):
int **matrix = malloc(rows * columns * sizeof(int));
int i;
for(i = 0; i < rows; i++)
matrix[i] = malloc(columns * sizeof(int));
答案 2 :(得分:0)
要获得具有完整动态数组数组的解决方案(在编译时具有未知行数和列数的2D矩阵),您应该使用int **
类型来表示矩阵。
int **board = malloc(height * sizeof *board);
for (i = 0; i < height; i++)
board[i] = malloc(width * sizeof **board);
然后使用int **
为board参数创建函数原型并像往常一样访问矩阵:
int x = board[i][j]; // store in x the element of row i and column j
答案 3 :(得分:0)
如果您有现代C,比如C99,则可以初始化具有可变内容的矩阵维度。它被称为可变长度数组,VLA。关于你的代码,你几乎就在那里。只需将原型更改为以下内容
即可void init(size_t cols, size_t rows, int board[rows][cols])
这样,当你来到矩阵的声明时,边界首先出现并且是已知的。
你可以主要在堆栈上分配这样的矩阵
int board[rows][cols];
(没有初始化程序)会这样做,但是如果你的维度变大,你就会冒着堆栈溢出的风险。要在堆上声明矩阵,您可以执行类似
的操作int (*board)[cols] = malloc(int[rows][cols]);
不要忘记将初始值分配给各个条目board[i][j]
,并在使用结束时释放整个矩阵。
编辑:看到所有这些答案试图通过指向指针的方式向您推销2D阵列的模拟。不要做那些复杂的事情,只要直接做语言为你提供的,VLA。