free():下一个大小无效(快):

时间:2014-08-26 18:32:09

标签: c gcc free calloc

在过去的一小时里,我一直在为这个奇怪的虫子挣扎。代码已经尽可能地最小化了,我在运行时仍然遇到以下错误:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x0000000001823010 ***

这就是我正在编译的内容。

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

    void random_fill(unsigned int * to_fill, unsigned int len) {
        srand(time(NULL));
        for( unsigned int i = 0; i < len; i++) {
            to_fill[i] = (float)rand() / RAND_MAX * 100;
        }
    }


    #define SEQ_SIZE 2048
    int main(void) {
        printf("Sequence Size: %i\n", SEQ_SIZE);
        unsigned int * sequence = 0;
        sequence = (unsigned int *) calloc(0, sizeof(unsigned int) * SEQ_SIZE);

        random_fill(sequence, SEQ_SIZE);

        for(int i = 0; i < SEQ_SIZE; i++) {
            printf("%u ", sequence[i]);
        }
        printf("\n");

        free((void *)sequence);

        return 0;
    }

我用来编译代码的命令是gcc -std=c99 main.c,我的gcc版本是 4.4.7 20120313 (在Red Hat 4.4.7上运行)。为了确认它不是gcc中的错误,我还使用gcc 4.8.2 编译它并仍然得到相同的错误。最后,我编译了这个并在我的笔记本电脑上运行它并且工作没有任何问题!

为什么我收到此错误?机器或我的操作系统有问题吗?

1 个答案:

答案 0 :(得分:4)

Petesh在评论中指出:

sequence = (unsigned int *) calloc(0, sizeof(unsigned int) * SEQ_SIZE);

该行将分配一些非零大小的元素。您可能正在寻找:

sequence = calloc(1, sizeof(unsigned int) * SEQ_SIZE);

哪个有效,但不能解决一些潜在的溢出问题。所以你应该写一下:

sequence = calloc(SEQ_SIZE, sizeof(unsigned int));

或者,甚至更好:

sequence = calloc(SEQ_SIZE, sizeof(*sequence));

其他想法:

您应该只在给定的程序中调用srand()一次。通常人们只是将其称为main()中的第一行。