当我尝试为struct array分配内存时出现分段错误

时间:2017-03-09 12:28:49

标签: c++ arrays

昨天我问你们一个问题,并意识到读取和写入一块块更有效,而不是一次只有一个块。所以现在我尝试读取和写入一大块块,但是我发生了分段错误。

#define POSITIONAL_TOKEN_CHUNK_SIZE 1000000
#define POSITIONAL_TOKEN_WORD_LENGTH 15
#define POSITIONAL_TOKEN_ID_LENGTH 4
#define POSITIONAL_TOKEN_LENGTH (POSITIONAL_TOKEN_WORD_LENGTH + POSITIONAL_TOKEN_ID_LENGTH)

struct PTBlk {
    char w[POSITIONAL_TOKEN_WORD_LENGTH + 1];
    int id;
};

int transform_to_bin_a(FILE * fin, int fd) {
    int n = 0;
    int m = 0;
    char buf[TRANSFORM_TO_BIN_BUF_LENGTH] = {};
    struct PTBlk * blks = (struct PTBlk *)malloc(POSITIONAL_TOKEN_CHUNK_SIZE * POSITIONAL_TOKEN_LENGTH);
    if (blks == NULL) {
        puts("no memory being allocated");
        return 0;
    }
    memset(buf, 0, TRANSFORM_TO_BIN_BUF_LENGTH);
    printf("total of size being allocated is %d bytes\n", POSITIONAL_TOKEN_CHUNK_SIZE * POSITIONAL_TOKEN_LENGTH);
    while (fgets(buf, TRANSFORM_TO_BIN_BUF_LENGTH, fin) != NULL) {
        ++n;
        sscanf(buf, "%s %d", blks[m].w, &blks[m].id);
        ++m;
        if (m >= POSITIONAL_TOKEN_CHUNK_SIZE) { // error !!
            write(fd, (void *)blks, POSITIONAL_TOKEN_CHUNK_SIZE * POSITIONAL_TOKEN_LENGTH);
            m = 0;
        }
        memset(buf, 0, TRANSFORM_TO_BIN_BUF_LENGTH);
    }
    if (m > 0) {
        printf("n:%d m:%d\n", n, m);
        printf("m:%d\n", m);
        write(fd, (void *)blks, m * POSITIONAL_TOKEN_LENGTH);
    }
    printf("n:%d\n", n);
    lseek(fd, 0, SEEK_SET);
    write(fd, (void *)&n, POSITIONAL_TOKEN_SEARCH_BEGIN);
    free(blks);
    return 1;
}

我猜POSITIONAL_TOKEN_CHUNK_SIZE太大是一个问题。但我不明白为什么它是分段错误的原因。因为在代码中我尝试在堆上只分配20,000,000个字节。有时我将long int数组编码为全局变量,例如'int arr [20000000];'。但这没关系。

我在代码中误解了什么?

0 个答案:

没有答案