Realloc与矩阵和自动化

时间:2015-03-17 15:34:14

标签: c pointers matrix malloc realloc

我想知道为什么如果我做类似的事情,为char *或任何1D数组工作的realloc oldpointer = realloc的(oldpointer,新尺寸);

但是当我尝试使用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\0");
    printf("%s",matrix[4]);

}

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

2 个答案:

答案 0 :(得分:0)

问题是你的双指针无法保存指针,因为你没有分配足够的空间。

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;

始终检查函数的返回值,如果它返回一个,例如malloc() / calloc() / realloc()以及任何自定义实现通常“,失败时返回NULL

答案 1 :(得分:0)

首先,您的matrix是一个char*数组,因此您应该分配:

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

同样适用于realloc()

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