Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 得到;“下一个尺寸无效”;执行free()时_C_Malloc_Free - Fatal编程技术网

C 得到;“下一个尺寸无效”;执行free()时

C 得到;“下一个尺寸无效”;执行free()时,c,malloc,free,C,Malloc,Free,我试图学习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行得到了一个错误,它是免费的(b[0]) 为什么它会产生无效的下一个自由尺寸(快速) #包括 #包括 #包括 int main() { char**a=(char**)malloc(100*sizeof(char*)); a[0]=

我试图学习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行得到了一个错误,它是免费的(b[0])

为什么它会产生无效的下一个自由尺寸(快速)

#包括
#包括
#包括
int main()
{
char**a=(char**)malloc(100*sizeof(char*));
a[0]=“再次你好!”;
char**b=(char**)malloc(100*sizeof(char*));
int i=0;
对于(i=0;i<100;i++){
b[i]=(char*)malloc(10*sizeof(char));
}
strcpy(b[0],*a);
免费(a);
printf(“%s”,b[0]);
对于(i=0;i<100;i++){
自由(b[i]);
}
免费(b);
返回0;
}

对于每个
b[i]
,您只为10个
char
s分配空间,但是
strcpy
复制字符串
“Hello reach!”
,这肯定超过了10个
char
s。这是未定义的行为。

字符串
“你好,又来了!”
有13个字符长(包括终止的
\0

为它分配的内存不足(您只分配了10个字符),因此在调用
strcpy
时,您正在覆盖已分配的内存,并且可能会覆盖库用于跟踪分配的内存位置

下次库尝试使用存储在那里的信息时,它会发现信息不一致,因此它会中止,并出现您提到的错误。如果图书馆能够找到任何这样的差异,那么这只是它可以打印的众多信息中的一条


一般来说,不要依赖库为您标记这些错误:在这种情况下,您“幸运”的是信息以可识别的方式损坏。如果你运气不好,你的程序可能会表现出未定义的行为。

当你执行这一行时

strcpy(b[0], *a);
你在写你不该用的记忆。这会导致未定义的行为


有些环境在分配的内存块末尾存储有用的信息。通过在该内存上写入,您已经销毁了有用的信息。

错误如下:

strcpy(b[0], *a);

您为
b[0]
分配了10个字节,但您复制了13个字节,因此写入的内容超出了分配内存的末尾。

这是缓冲区溢出,因为
strlen(a[0])+1>10
。您需要为
b[0]
分配超过10个字符,特别是至少
strlen(a[0])+1

。这背后的原因是什么?请注意,
sizeof(char)
被指定为始终为
1
@PeterHwang。您没有单击链接吗?从技术上讲,这不是可能表现出未定义行为的问题-这是未定义的行为。这包括OP遇到的错误。
strcpy(b[0], *a);