使用 C 创建动态矩阵



我尝试用c理解malloc和动态分配,但是当我编译程序时一切都很好,但是如果我运行它,终端会告诉我分段错误(核心转储)并退出

#include <stdio.h>
#include <stdlib.h>
int main(){
int **matrice;
int righe, colonne;
int r, c;
printf("Quante RIGHE deve avere la matrice? ");
scanf("%d", &righe);
printf("Quante COLONNE deve avere la matrice? ");
scanf("%d", &colonne);
matrice = (int**) malloc(righe*colonne*sizeof(int));
for(r=0; r<righe; r++){
matrice[r] = (int*) malloc(colonne*sizeof(int));
for(r=0; r<righe; r++){
for(c=0; c<colonne; c++){
printf("Elemento[%d][%d]: ",r, c);
scanf("%d", &matrice[r][c]);
}
// print out
for(r=0; r<righe; r++){
for(c=0; c<colonne; c++){
printf ("%dn", matrice[r][c]);
}
}
}
}
}

您有许多步骤顺序不正确,并且您对循环填充matrice的顺序不正确。您还缺少对所有输入和所有分配的验证。要更正问题,您可以执行以下操作:

#include <stdio.h>
#include <stdlib.h>
int main(){
int **matrice;
int righe, colonne;
int r, c;
printf("Quante RIGHE deve avere la matrice? ");
if (scanf("%d", &righe) != 1) {
fprintf (stderr, "error: invalid input - righe.n");
return 1;
}
printf("Quante COLONNE deve avere la matrice? ");
if (scanf("%d", &colonne) != 1) {
fprintf (stderr, "error: invalid input - colonne.n");
return 1;
}
matrice = malloc (righe * sizeof *matrice);
if (!matrice) {
perror ("matrice");
return 1;
}
for (r = 0; r < righe; r++){
matrice[r] = malloc (colonne * sizeof *matrice[r]);
if (!matrice[r]) {
perror ("matrice[r]");
return 1;
}
for (c = 0; c < colonne; c++){
printf ("Elemento[%d][%d]: ",r, c);
if (scanf ("%d", &matrice[r][c]) != 1) {
fprintf (stderr, "error: matrice[r][c].n");
return 1;
}
}
}
// print out
for (r = 0; r < righe; r++){
for (c = 0; c < colonne; c++)
printf (" %3d", matrice[r][c]);
putchar ('n');
free (matrice[r]);
}
free (matrice);
}

注意不要忘记free您分配的内存。

示例使用/输出

$ ./bin/arrmatrice
Quante RIGHE deve avere la matrice? 3
Quante COLONNE deve avere la matrice? 3
Elemento[0][0]: 1
Elemento[0][1]: 2
Elemento[0][2]: 3
Elemento[1][0]: 4
Elemento[1][1]: 5
Elemento[1][2]: 6
Elemento[2][0]: 7
Elemento[2][1]: 8
Elemento[2][2]: 9
1   2   3
4   5   6
7   8   9

仔细查看,如果您有其他问题,请告诉我。

您错过了一个"*",并在最后两个循环中嵌套错误。我相信这就是你想要的:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int **matrice;
int righe, colonne;
int r, c;
printf("Quante RIGHE deve avere la matrice? ");
scanf("%d", &righe);
printf("Quante COLONNE deve avere la matrice? ");
scanf("%d", &colonne);
matrice = (int **) malloc(righe * sizeof(int *)); //<<< here
for(r=0; r<righe; r++)
{
matrice[r] = (int *) malloc(colonne * sizeof(int));
for(c = 0; c < colonne; ++c) //<<< here
{
printf("Elemento[%d][%d]: ", r, c);
scanf("%d", &matrice[r][c]);
}
}
for(r = 0; r < righe; ++r) //<<< here
for(c = 0; c < colonne; ++c)
printf ("%dn", matrice[r][c]);
}

您帖子中的确切问题已在评论中得到解答(现在在接受的答案中),但另一个建议是将2D矩阵的分配合并为一个函数,例如:

int ** Create2D(int c, int r)
{   
int **arr;
int    y;
arr   = calloc(c, sizeof(int *));
for(y=0;y<c;y++)
{
arr[y] = calloc(r, sizeof(int));    
}
return arr;
}

这将需要对代码中的循环进行一些体系结构更改(顺便说一下,这是问题的一部分),并简化整体工作。

使用此代码生成的数组后,应像往常一样释放它。 这可以通过创建单个函数来以类似的方式完成:

void free2D(ssize_t **arr, ssize_t c)
{
int i;
if(!arr) return;
for(i=0;i<c;i++)
{
free(arr[i]);
arr[i] = NULL;
}
free(arr);
arr = NULL;
}

例如,用法类似于:

... 
int ** twoDArray = Create2D(colonne, righe);
if(twoDArray)
{ 
// use array 
//...
free2D(twoDArray, colonne);
}
...

malloc调用是问题所在,您分配了错误数量的 字节。

矩阵是通过具有指向数组的指针创建的,该数组包含指向int数组 .

int **matrix = calloc(rows, sizeof(*matrix));
if(matrix == NULL)
// handle the error

现在您必须初始化列:

for(int i = 0; i < rows; ++i)
matrix[i] = calloc(cols, sizeof *matrix[i]);
if(matrix[i] == NULL)
// handle the error

现在,您可以通过以下途径访问每个单元格matrix[i][j].

释放矩阵也很容易:

for(int i = 0; i < rows; ++i)
free(matrix[i]);
free(matrix);

请注意,我使用了calloc而不是malloc。差异(除了 使用 2 个参数而不是一个)是calloc设置分配的内存 到 0。当您进行错误处理并希望免费时,这是一个巨大的帮助 记忆。free(NULL)不是被禁止的。

创建专用函数(如create_matrixfree_matrix.将所有内容设置为 0 真的很方便。

最后一件事:我建议在调用malloc时不要使用sizeof(<data type>)calloc.很容易错过正确的类型,错过*或犯错误 通常。 但是sizeof *var返回始终正确数量的 字节。

相关内容

  • 没有找到相关文章

最新更新