程序在 free() 上崩溃并显示无效指针消息
Program crashing on free() with an invalid pointer message
我不知道为什么会出现此错误:
Error in `./prog': free(): invalid pointer: 0x0941600b
执行这段代码时
#include<stdio.h>
#include<stdlib.h>
int main()
{
int test;
scanf("%d",&test);
while(test)
{
char *s;
int count=0;
s=(char *)calloc(10000,sizeof(char));
scanf("%s",s);
while(*s)
{
if(*s=='W')
count++;
s++;
}
printf("%d\n",count);
free(s);
test--;
}
return 0;
}
在你的代码中,你首先做了
s++; //moving the actually returned pointer
然后,你尝试了
free(s); //pass the changed pointer
因此,一旦您没有传递 return 由 calloc()
编辑的相同指针。这会调用 undefined behavior.
添加,引用 C11
标准,章节 §7.22.3.3
[...] if
the argument does not match a pointer earlier returned by a memory management
function, or if the space has been deallocated by a call to free
or realloc
, the
behavior is undefined.
所以 s++
修改了不再相同的原始指针,它已被 calloc()
return 编辑并将其传递给 free()
调用 UB。您需要保留原始指针的副本,以便稍后将其传递给 free()
。
也就是说,
- Please see this discussion on why not to cast the return value of
malloc()
and family in C
..
- 在使用 returned 值之前,您应该始终检查
calloc()
和家族的 return 值,以避免在函数调用失败时取消对 NULL 指针的引用。
您在递增后使用 s
的值调用 free
。您需要保存从 calloc
返回的值,以便可以将其传递给 free
.
我不知道为什么会出现此错误:
Error in `./prog': free(): invalid pointer: 0x0941600b
执行这段代码时
#include<stdio.h>
#include<stdlib.h>
int main()
{
int test;
scanf("%d",&test);
while(test)
{
char *s;
int count=0;
s=(char *)calloc(10000,sizeof(char));
scanf("%s",s);
while(*s)
{
if(*s=='W')
count++;
s++;
}
printf("%d\n",count);
free(s);
test--;
}
return 0;
}
在你的代码中,你首先做了
s++; //moving the actually returned pointer
然后,你尝试了
free(s); //pass the changed pointer
因此,一旦您没有传递 return 由 calloc()
编辑的相同指针。这会调用 undefined behavior.
添加,引用 C11
标准,章节 §7.22.3.3
[...] if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to
free
orrealloc
, the behavior is undefined.
所以 s++
修改了不再相同的原始指针,它已被 calloc()
return 编辑并将其传递给 free()
调用 UB。您需要保留原始指针的副本,以便稍后将其传递给 free()
。
也就是说,
- Please see this discussion on why not to cast the return value of
malloc()
and family inC
.. - 在使用 returned 值之前,您应该始终检查
calloc()
和家族的 return 值,以避免在函数调用失败时取消对 NULL 指针的引用。
您在递增后使用 s
的值调用 free
。您需要保存从 calloc
返回的值,以便可以将其传递给 free
.