Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何更改动态分配矩阵的大小?_C_Arrays_Matrix_Size - Fatal编程技术网

C 如何更改动态分配矩阵的大小?

C 如何更改动态分配矩阵的大小?,c,arrays,matrix,size,C,Arrays,Matrix,Size,我在学校有一个练习。我必须制作一个动态分配的矩阵,其中填充随机数,大小由用户选择。然后,程序要求用户重新定义更大的大小,新矩阵必须保留旧值并用随机数填充新值 当我试图重新定义矩阵的大小时,程序被阻塞了。从第73行开始,我收到一个分段错误。我不明白为什么:| #include<stdio.h> #include<stdlib.h> #include<time.h> #include<stddef.h> int nbRand() { stat

我在学校有一个练习。我必须制作一个动态分配的矩阵,其中填充随机数,大小由用户选择。然后,程序要求用户重新定义更大的大小,新矩阵必须保留旧值并用随机数填充新值

当我试图重新定义矩阵的大小时,程序被阻塞了。从第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");
    }
}
#包括
#包括
#包括
#包括
int nbRand(){
静态int first=0;
如果(第一个==0){
srand(时间(空));
第一个=1;
}
返回rand()%10;
}
int main(int argc,char*argv[]){
int**matrice,**matrice2;//表
int i,j;//编译器
int longueur1,largeur1,longueur2,largeur2;//动态画面
尺寸;
printf(“从画面上看风景”);
printf(“Longueur:”);
scanf(“%d”和“longueur1”);
printf(“Largeur:”);
scanf(“%d”&largeur1);
矩阵=(int**)malloc(longueur1*sizeof(int*);
对于(i=0;i
编辑:

#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");
    }
}
#包括
#包括
#包括
#包括
int nbRand(){
静态int first=0;
如果(第一个==0){
srand(时间(空));
第一个=1;
}
返回rand()%10;
}
int main(int argc,char*argv[]){
整数**矩阵;
int**tmp;//表
int i,j;//编译器
int longueur1,largeur1,longueur2,largeur2;//动态画面
尺寸;
printf(“从画面上看风景”);
printf(“Longueur:”);
scanf(“%d”和“longueur1”);
printf(“Largeur:”);
scanf(“%d”&largeur1);
矩阵=(int**)malloc(longueur1*sizeof(int*);
对于(i=0;i
matrice2=(int**)realloc(matrice,longueur2*sizeof(int*);
对于(i=0;i您正在这里访问旧指针。
}
这是错误的,应该是错误的

matrice2 = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
    matrice2[i] =  realloc(matrice2[i], largeur2*sizeof(int));
}
matrice2=(int**)realloc(matrice,longueur2*sizeof(int*);
对于(i=0;i
matrice2=(int**)realloc(matrice,longueur2*sizeof(int*);
对于(i=0;i您正在这里访问旧指针。
}
这是错误的,应该是错误的

matrice2 = (int**) realloc(matrice, longueur2*sizeof(int*));
for(i = 0; i < longueur2; i++) {
    matrice2[i] =  realloc(matrice2[i], largeur2*sizeof(int));
}
matrice2=(int**)realloc(matrice,longueur2*sizeof(int*);
对于(i=0;i
你应该用谷歌搜索
realloc
。是的,但我不知道我错在哪里:/你应该用谷歌搜索
realloc
。是的,但我不知道我错在哪里:/好奇的是,代码在一个地方使用了不必要的cast
(int**)
而在
矩阵2[I]=realloc中却很整洁(…
谢谢你的回答…我试过了,但是,我在GDB中收到了一个SIGTRAP错误,下面是结果:当我改变大小时,程序的结果。我在第一条消息中添加了经过修改编辑的代码。奇怪的是,代码在一个地方使用了不必要的强制转换
(int**)
,但在
矩阵2[I]=realloc中却很整洁