我尝试用C来理解MALLC和动态分配,但是当我编译程序时,一切都可以,但是如果我运行它,终端告诉我分割错误(内核转储)和退出。
#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 ("%d\n", 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);
}
注意不要忘记分配的内存。
示例使用/输出
$ ./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
再看一遍,如果你还有问题,请告诉我。