在过去的一小时里,我一直在为这个奇怪的虫子挣扎。代码已经尽可能地最小化了,我在运行时仍然遇到以下错误:
*** 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 编译它并仍然得到相同的错误。最后,我编译了这个并在我的笔记本电脑上运行它并且工作没有任何问题!
为什么我收到此错误?机器或我的操作系统有问题吗?
答案 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()
中的第一行。