使用矩阵和自动化重新分配
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
分配足够的内存,你应该很好。
我想知道如果我做类似的事情,为什么重新分配一个 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
分配足够的内存,你应该很好。