This question already has answers here:
Closed 4 years ago.
String assignment in C
(4个答案)
这是有问题的片段。
这段代码在32位模式下运行良好,但在64位模式下崩溃得可怕。
在我的主程序中,我忽略了不时释放
我试着玩弄地址和指针,甚至试过
也失败了。有人能澄清我做错了什么吗?
造成问题。它覆盖
您将面临内存泄漏,因为
不能用更改的指针调用
解决方案:
在
笔记:
即使在
使用正确的格式说明符。在
(4个答案)
这是有问题的片段。
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] = '\0';
}
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);
}
这段代码在32位模式下运行良好,但在64位模式下崩溃得可怕。
在我的主程序中,我忽略了不时释放
free()
的成员,这会导致未被屏蔽的行为,这显然是我不想要的。我试着玩弄地址和指针,甚至试过
free(RESERV+(i*sizeof(char*))
也失败了。有人能澄清我做错了什么吗?
最佳答案
在你的代码中
RESERV[i]="Iambananananananananananana";
造成问题。它覆盖
malloc()
分配的内存。因此,您将面临内存泄漏,因为
malloc()
ed指针丢失。不能用更改的指针调用
free()
。它调用undefined behaviour。解决方案:
在
C
中,您不分配字符串,而是可以使用strcpy()
完成工作。笔记:
即使在
strcpy()
的情况下,也不能使用"Iambananananananananananana"
。在这种情况下,它将创建内存溢出,因为目标没有足够的内存来完全容纳它。使用正确的格式说明符。在
printf()
语句中,%i
的大多数参数都不是int
类型。对于指针类型参数,应至少使用%p
。否则,它将是UB。关于c - 无法正确释放另一个malloc的malloc ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30168843/