我想知道为什么如果我做类似的事情,为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 *** 中止
答案 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分配足够的内存,你应该很好。