使用矩阵和自动化重新分配

Realloc with matrix and automatization

我想知道如果我做类似的事情,为什么重新分配一个 char* 或任何一维数组会起作用 oldpointer=realloc(oldpointer,newsize);

但是当我尝试使用 2D char* 数组时它失败了。 到处看,我看到有时人们使用 NewPointer=realloc(oldpointer,newsize) 但如果它是唯一的用途,它对我没有用,因为我需要经常在一个循环中调整矩阵的列和行的大小(我必须先填充一个字符串数组,而不知道如何我将插入许多字符串,也不是每个字符串的大小)

我用来尝试的代码是这样的,

void main(){
    int max = 5, i,j;
    char **matrix;
    matrix=malloc(max*sizeof(char));
    for(i=0;i<max;i++){
        matrix[i]=malloc(max*sizeof(char));

    }
    matrix=realloc(matrix,max*2*sizeof(char));

    strcpy(matrix[4],"we[=10=]");
    printf("%s",matrix[4]);

}

`./out' 中的错误:realloc():下一个大小无效:0x00000000015c4010 *** 中止

问题是你的双指针不能容纳指针,因为你没有分配足够的space。

matrix = malloc(max * sizeof(char));
/* which is exactly the same as
 * matrix = malloc(max);
 */

应该是

matrix = malloc(max * sizeof(char *));
/*                        ^ max pointers, so sizeof a poitner */ 

那么如果你想realloc(),你可以这样做

void *pointer;

pointer = realloc(matrix, 2 * max * sizeof(char *));
if (poitner == NULL)
    handleFailure_OrExit_ButDoNot_Use_The_Realloced_Poitner();
matrix = pointer;

始终 检查函数的 return 值,如果它 return 是一个,例如 malloc()/calloc() /realloc()和任何自定义实现通常”,return NULL 失败。

首先你的 matrix 是一个 char* 的数组,所以你应该分配:

matrix=malloc(max * sizeof(char*));

同样适用于 realloc()

你也不需要"we[=14=]""we"就够了。双引号中的所有字符串都是 NUL 终止字符串文字。为每个 char*char 分配足够的内存,你应该很好。