无法正确释放另一个 malloc 的 malloc
Unable to properly free malloc of another malloc
这是有问题的片段。
int main()
{
char** RESERV = (char**)malloc(sizeof(char*)*4);
printf("%i, %i, %i, %i, %i", **RESERV, *RESERV, RESERV, &**RESERV, sizeof(char*));
int i;
for(i = 0; i < 4; i++)
{
RESERV[i] = (char*)calloc(sizeof(char),16);
RESERV[i][15] = '[=10=]';
}
for(i = 0; i < 4; i++)
RESERV[i]="Iambananananananananananana";
for(i = 0; i < 4; i++)
printf("\r\n>%i<", RESERV[i]);
for(i = 0; i < 4; i++)
{
printf("\r\n<%i>", (RESERV[i]));
free(RESERV[i]);
}
free(RESERV);
}
此代码 free()
在 32 位模式下运行良好,但在 64 位模式下会以某种方式严重崩溃。
在我的主程序中,我忽略了释放 char**
的成员时不时地导致意外行为,这显然是我不希望的。
我尝试过使用地址和指针,甚至尝试过
free(RESERV+(i*sizeof(char*))
也失败了。有人可以澄清我做错了什么吗?
在你的代码中
RESERV[i]="Iambananananananananananana";
造成问题。它 覆盖 由 malloc()
分配的内存。因此,
- 您面临内存泄漏,因为
malloc()
ed 指针丢失。
- 您不能使用更改后的指针调用
free()
。它调用 undefined behaviour.
解法:
在 C
中,您不分配 字符串 ,相反,您可以使用 strcpy()
来完成您的工作。
备注:
即使 strcpy()
也不能使用 "Iambananananananananananana"
。在这种情况下,它会造成内存溢出,因为目标没有足够的内存来完全容纳它。
使用正确的格式说明符。在您的 printf()
语句中,%i
的大部分参数都不是 int
类型。对于指针类型参数,您至少应该使用 %p
。否则就是UB。
RESERV[i]="Iambananananananananananana";
这不是分配后填充此字符串的正确方法。您正在覆盖该指针的值。
strncpy(RESERV[i], "Iambananananananananananana", 15);
RESERV[i][15] = 0;
这就是您要找的。
另请注意,您显然要向该指针分配的内容大于您分配的内存。
行
RESERV[i]="Iambananananananananananana";
不正确 - 你需要做
strncpy(RESERV[i], "Iambananananananananananana", 15);
RESERVp[i][15] = 0;
这是有问题的片段。
int main()
{
char** RESERV = (char**)malloc(sizeof(char*)*4);
printf("%i, %i, %i, %i, %i", **RESERV, *RESERV, RESERV, &**RESERV, sizeof(char*));
int i;
for(i = 0; i < 4; i++)
{
RESERV[i] = (char*)calloc(sizeof(char),16);
RESERV[i][15] = '[=10=]';
}
for(i = 0; i < 4; i++)
RESERV[i]="Iambananananananananananana";
for(i = 0; i < 4; i++)
printf("\r\n>%i<", RESERV[i]);
for(i = 0; i < 4; i++)
{
printf("\r\n<%i>", (RESERV[i]));
free(RESERV[i]);
}
free(RESERV);
}
此代码 free()
在 32 位模式下运行良好,但在 64 位模式下会以某种方式严重崩溃。
在我的主程序中,我忽略了释放 char**
的成员时不时地导致意外行为,这显然是我不希望的。
我尝试过使用地址和指针,甚至尝试过
free(RESERV+(i*sizeof(char*))
也失败了。有人可以澄清我做错了什么吗?
在你的代码中
RESERV[i]="Iambananananananananananana";
造成问题。它 覆盖 由 malloc()
分配的内存。因此,
- 您面临内存泄漏,因为
malloc()
ed 指针丢失。 - 您不能使用更改后的指针调用
free()
。它调用 undefined behaviour.
解法:
在 C
中,您不分配 字符串 ,相反,您可以使用 strcpy()
来完成您的工作。
备注:
即使
strcpy()
也不能使用"Iambananananananananananana"
。在这种情况下,它会造成内存溢出,因为目标没有足够的内存来完全容纳它。使用正确的格式说明符。在您的
printf()
语句中,%i
的大部分参数都不是int
类型。对于指针类型参数,您至少应该使用%p
。否则就是UB。
RESERV[i]="Iambananananananananananana";
这不是分配后填充此字符串的正确方法。您正在覆盖该指针的值。
strncpy(RESERV[i], "Iambananananananananananana", 15);
RESERV[i][15] = 0;
这就是您要找的。
另请注意,您显然要向该指针分配的内容大于您分配的内存。
行
RESERV[i]="Iambananananananananananana";
不正确 - 你需要做
strncpy(RESERV[i], "Iambananananananananananana", 15);
RESERVp[i][15] = 0;