昨天我问你们一个问题,并意识到读取和写入一块块更有效,而不是一次只有一个块。所以现在我尝试读取和写入一大块块,但是我发生了分段错误。
#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];'。但这没关系。
我在代码中误解了什么?