我想知道,如果我做了这样的事情,为什么char*或任何1D数组的realloc有效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 ");
printf("%s",matrix[4]);
}
"中出错/out':realloc():无效的下一个大小:0x00000000015c4010***中止
问题是您的双指针无法容纳指针,因为您没有分配足够的空间。
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
。
首先,您的matrix
是char*
的数组,因此您应该分配:
matrix=malloc(max * sizeof(char*));
对于CCD_ 8。
您也不需要"we "
,"we"
就足够了。所有双引号中的字符串都是以NUL
结尾的字符串文字。为char*
和char
中的每一个分配足够的内存,您应该是优秀的。