我不知道,为什么我会收到此错误:
`./prog' ;: free()出错:指针无效: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;
}
答案 0 :(得分:2)
在你的代码中,你首先做了
s++; //moving the actually returned pointer
然后,你试过
free(s); //pass the changed pointer
所以,一旦你没有传递calloc()
返回的同一个指针。这会调用undefined behavior。
添加,引用C11
标准,章节§7.22.3.3
[...]如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用
free
或realloc
释放了空格,则 行为未定义。
所以s++
修改calloc()
返回的原始指针不再相同,并将其传递给free()
调用UB。您需要保留原始指针的副本,以便稍后将其传递给free()
。
那就是说,
malloc()
and family in C
.。calloc()
和family的返回值,以避免在函数调用失败时拒绝传递NULL指针。答案 1 :(得分:1)
在您递增free
之后,使用值s
调用calloc
。您需要保存从free
返回的值,以便将其传递给{{1}}。