动态矩阵和动态值转换成矩阵

时间:2012-01-22 16:25:00

标签: c

这是我的代码 - 我将自己的值(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;
}

4 个答案:

答案 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。