c - 如何改变动态分配矩阵的大小?
问题描述
我在学校有一个 C 练习。我必须制作一个动态分配的矩阵,其中填充随机数,并且其大小由用户选择。然后,程序要求用户重新定义更大的尺寸,新矩阵必须保留旧值并随机填充新值。
当我试图重新定义矩阵的大小时,程序被阻塞了。从第 73 行开始,我收到了分段错误。我不明白为什么:|
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stddef.h>
int nbRand() {
static int first = 0;
if(first == 0) {
srand(time(NULL));
first = 1;
}
return rand()%10;
}
int main(int argc, char *argv[] ){
int **matrice, **matrice2; // Tableau
int i, j; // Compteur
int longueur1, largeur1, longueur2, largeur2; // Taille dynamique tableau
size_t n;
printf("Saisissez la taille du tableau.\n");
printf("Longueur : ");
scanf("%d", &longueur1);
printf("Largeur : ");
scanf("%d", &largeur1);
matrice = (int**) malloc(longueur1*sizeof(int*));
for(i = 0; i < longueur1; i++) {
matrice[i] = (int*) malloc(largeur1*sizeof(int));
}
/* Autre manière
matrice = (int*) malloc(longueur1*largeur1*sizeof(int));
*/
for(i = 0; i < longueur1; i++) {
for(j = 0; j < largeur1; j++) {
matrice[i][j] = nbRand();
}
}
for(i = 0; i < longueur1; i++) {
for(j = 0; j < largeur1; j++) {
printf("%d ", matrice[i][j]);
}
printf("\n");
}
// Agrandir la matrice
printf("NOUVELLE TAILLE\n");
do {
printf("Longueur : ");
scanf("%d", &longueur2);
} while(longueur2 < longueur1);
do {
printf("Largeur : ");
scanf("%d", &largeur2);
} while(largeur2 < largeur1);
matrice2 = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
matrice2[i] = (int*) realloc(matrice[i], largeur2*sizeof(int));
}
matrice=matrice2;
for(i = 0; i < longueur2; i++) {
for(j = 0; j < largeur2; j++) {
matrice[i][j] = nbRand();
printf("%d\t%d\t%d\n", i, j, matrice[i][j]);
}
}
printf("test\n");
for(i = 0; i < longueur2; i++) {
for(j = 0; j < largeur2; j++) {
printf("%d ", matrice[i][j]);
}
printf("\n");
}
}
编辑:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stddef.h>
int nbRand() {
static int first = 0;
if(first == 0) {
srand(time(NULL));
first = 1;
}
return rand()%10;
}
int main(int argc, char *argv[] ){
int** matrice;
int** tmp; // Tableau
int i, j; // Compteur
int longueur1, largeur1, longueur2, largeur2; // Taille dynamique tableau
size_t n;
printf("Saisissez la taille du tableau.\n");
printf("Longueur : ");
scanf("%d", &longueur1);
printf("Largeur : ");
scanf("%d", &largeur1);
matrice = (int**) malloc(longueur1*sizeof(int*));
for(i = 0; i < longueur1; i++) {
*(matrice+i) = (int*) malloc(largeur1*sizeof(int));
}
for(i = 0; i < longueur1; i++) {
for(j = 0; j < largeur1; j++) {
matrice[i][j] = nbRand();
}
}
for(i = 0; i < longueur1; i++) {
for(j = 0; j < largeur1; j++) {
printf("%d ", matrice[i][j]);
}
printf("\n");
}
// Agrandir la matrice
printf("NOUVELLE TAILLE\n");
do {
printf("Longueur : ");
scanf("%d", &longueur2);
} while(longueur2 < longueur1);
do {
printf("Largeur : ");
scanf("%d", &largeur2);
} while(largeur2 < largeur1);
tmp = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
*(tmp + i) = (int*) realloc(*(tmp+i), largeur2*sizeof(int));
}
matrice=tmp;
for(i = longueur1; i < longueur2; i++) {
for(j = largeur2; j < largeur2; j++) {
matrice[i][j] = nbRand();
// printf("%d\t%d\t%d\n", i, j, matrice[i][j]);
}
}
printf("test\n");
for(i = 0; i < longueur2; i++) {
for(j = 0; j < largeur2; j++) {
printf("%d ", matrice[i][j]);
}
printf("\n");
}
}
解决方案
matrice2 = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
matrice2[i] = (int*) realloc(matrice[i], largeur2*sizeof(int));
^^^^^^^^^^
|
-> You are accessing old pointer here.
}
错了,应该是
matrice2 = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
matrice2[i] = realloc(matrice2[i], largeur2*sizeof(int));
}