程序在 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()

也就是说,

  1. Please see this discussion on why not to cast the return value of malloc() and family in C..
  2. 在使用 returned 值之前,您应该始终检查 calloc() 和家族的 return 值,以避免在函数调用失败时取消对 NULL 指针的引用。

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