使用无效指针消息

时间:2016-03-27 20:02:01

标签: c pointers malloc free calloc

我不知道,为什么我会收到此错误:

  

`./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;
}

2 个答案:

答案 0 :(得分:2)

在你的代码中,你首先做了

 s++;  //moving the actually returned pointer

然后,你试过

 free(s);  //pass the changed pointer

所以,一旦你没有传递calloc()返回的同一个指针。这会调用undefined behavior

添加,引用C11标准,章节§7.22.3.3

  

[...]如果   该参数与先前由内存管理返回的指针不匹配   函数,或者如果通过调用freerealloc释放了空格,则   行为未定义。

所以s++修改calloc()返回的原始指针不再相同,并将其传递给free()调用UB。您需要保留原始指针的副本,以便稍后将其传递给free()

那就是说,

  1. Please see this discussion on why not to cast the return value of malloc() and family in C.
  2. 在使用返回的值之前,应始终检查calloc()和family的返回值,以避免在函数调用失败时拒绝传递NULL指针。

答案 1 :(得分:1)

在您递增free之后,使用值s调用calloc。您需要保存从free返回的值,以便将其传递给{{1}}。