尝试释放C中字符数组的数组会导致双重释放或损坏

尝试释放C中字符数组的数组会导致双重释放或损坏,c,arrays,pointers,char,C,Arrays,Pointers,Char,我正在从事一个项目,其中我必须创建一个字符串数组(char*),然而,当我尝试释放数组数组时,给出了“双重释放或损坏”,我无法解决问题 这里的代码提取是一个简化版本,它可能看起来毫无意义,但它说明了我面临的问题: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char **cptr; int i; cptr = malloc(256*s

我正在从事一个项目,其中我必须创建一个字符串数组(char*),然而,当我尝试释放数组数组时,给出了“双重释放或损坏”,我无法解决问题

这里的代码提取是一个简化版本,它可能看起来毫无意义,但它说明了我面临的问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char **cptr;
    int i;

    cptr = malloc(256*sizeof(char));
    for (i=0; i<256; i++) {
        cptr[i] = calloc(2, sizeof(char));
        cptr[i][0] = (char)i;
    }
    for (i=0; i<256; i++) {
        free(cptr[i]);
    }
    free(cptr);

    return 0;
}
#包括
#包括
#包括
int main()
{
字符**cptr;
int i;
cptr=malloc(256*sizeof(char));
对于(i=0;i
上面的行是错误的。即使您计算上面分配的字节数,它也是256字节。如果您的计算机上指针的大小是4字节,则足以容纳64个指针。相反,您需要256个指针。请使用

cptr = malloc(256 * sizeof(char *));

256*sizeof(char*)
为您提供256个指针现在一切都有意义了。另一方面,当我尝试调试程序时,我尝试
for(I=0;i@user3259983使用c[i]=calloc..已经消耗了比以前更多的字节,这会触发未定义的行为,这意味着可能发生。c[i]消耗四个字节。在计算中使用指向元素的大小(即
cptr=malloc(256*sizeof*cptr)
)是半习惯用法,以避免类似错误。遗漏
*
当然同样可能,但如果您习惯了这种习惯用法,至少应该会引起人们的注意。
cptr = malloc(256 * sizeof(char *));