C:rand()函数偶尔会导致分段错误

时间:2014-12-20 12:48:41

标签: c linux segmentation-fault

给定以下是在二进制文件中存储随机整数的代码。二进制文件的大小应该是65536字节,所以我必须生成总共16634个整数,然后一次保存16个整数。这已在 populateBackingStore()函数中实现。 这里的问题是分段错误发生在“有时”在行:

buffer [i%16] = rand ()  % MAX_INT;.

注意:出于调试目的,我打印了迭代编号,我发现分段错误只发生在 16358th迭代

#include <stdio.h>

#define     BACKING_STORE   65536
#define     MAX_INT     42949678295

int populateBackingStore () {
    FILE * backingStore = fopen ("BACKING_STORE.bin", "wb");
    int num, i;
    int * buffer = (int* ) malloc (16);     // 64 * (4 bytes) = 256 bytes 

    if (backingStore == NULL) {
        printf ("Error while creating file BACKING_STORE.bin\n");
        return NULL;
    }

    srand (time (NULL));
    for (i = 0; i < BACKING_STORE/sizeof (int) ;i ++) {
        buffer [i%16] = rand ()  % MAX_INT;
        if ( i % 16 == 0 ) {
            fwrite (buffer, sizeof (int), 16, backingStore);
        }           
        printf ("%d ", i);
    }
    fclose (backingStore);  
}

int main () {
    populateBackingStore ();

    return 0;
}

1 个答案:

答案 0 :(得分:7)

int * buffer = (int* ) malloc (16);

您没有为16 int分配足够的空间。你正在分配16个字节。

更改为

int * buffer = malloc (16 * sizeof (*buffer));

相关阅读:

  1. malloc() man page
  2. Do not cast malloc()的返回值。