这是带有问题的片段。
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] = ' ';
}
for(i = 0; i < 4; i++)
RESERV[i]="Iambananananananananananana";
for(i = 0; i < 4; i++)
printf("rn>%i<", RESERV[i]);
for(i = 0; i < 4; i++)
{
printf("rn<%i>", (RESERV[i]));
free(RESERV[i]);
}
free(RESERV);
}
此代码free()
在32位工作正常,但以某种方式以64位模式崩溃。
在我的主要程序中,我省略了释放char**
成员时时不时引起不可辩护的行为的成员,我显然不想要。
我尝试玩地址和指针,甚至尝试了
free(RESERV+(i*sizeof(char*))
也失败了。有人可以澄清我做错了什么吗?
在您的代码
中 RESERV[i]="Iambananananananananananana";
创建问题。覆盖由malloc()
分配的内存。因此,
- 您将面临内存泄漏,因为
malloc()
ED指针是 Lost 。 - 您无法用更改的指针调用
free()
。它调用了未定义的行为。
解决方案:
在C
中,您不分配 strings ,而是可以使用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;