我正在尝试学习c的内存管理。
我为
分配了内存1. char** a
2. char** b
3. char* b[0] ~ b[99]
和
我释放了
的记忆1. char** a
2. char* b[0] ~ b[99]
3. char** b
但是,我在第33行收到错误,即free(b[0])
为什么会产生invalid next size free (fast)
?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char** a = (char**)malloc(100 * sizeof(char*));
a[0] = "Hello Again!";
char** b = (char**)malloc(100 * sizeof(char*));
int i = 0;
for(i = 0; i < 100; i++){
b[i] = (char*)malloc(10 * sizeof(char));
}
strcpy(b[0], *a);
free(a);
printf("%s", b[0]);
for(i = 0; i < 100; i++){
free(b[i]);
}
free(b);
return 0;
}
答案 0 :(得分:1)
字符串"Hello Again!"
长度为13个字符(包括终止\0
)。
你为它分配的内存是不够的(你只分配10个字符),所以在调用strcpy
时你覆盖了分配的内存,并可能覆盖了库使用的内存位置来跟踪分配。
下次库将尝试使用存储在那里的信息时,它会发现它不一致,因此它会因您提到的错误而中止。如果它能够找到任何这样的差异,那么这只是图书馆可以打印的许多消息之一。
一般来说,不要依赖图书馆为你标记这些错误:在这种情况下,你是&#34;幸运&#34;信息以可识别的方式被破坏了。如果你运气不好,你的程序可能只会出现未定义的行为。
答案 1 :(得分:0)
对于每个b[i]
,您只为10 char
分配空间,但strcpy
复制字符串"Hello Again!"
,这肯定超过10 char
}秒。这是未定义的行为。
答案 2 :(得分:0)
执行此行时,
strcpy(b[0], *a);
你正在写你不应该使用的记忆。这导致了未定义的行为。
某些环境在分配的内存块的末尾存储有用的信息。通过写入该内存,您已经破坏了有用的信息。
答案 3 :(得分:0)
错误就在这一行:
strcpy(b[0], *a);
为b[0]
分配10个字节,但是复制了13个字节,从而写入超出分配内存的末尾。
答案 4 :(得分:0)
因为strlen(a[0]) + 1 > 10
而导致缓冲区溢出。您需要为b[0]
分配超过10个字符,特别是至少strlen(a[0]) + 1
。