怪异的C分割故障



所以我有这一点代码

int main(int argc, char *argv[]) {
    char *vendas[1];
    int size = 1;
    int current = 0;
    char buffer[50];
    char *token;
    FILE *fp = fopen("Vendas_1M.txt", "r");
    while(fgets(buffer, 50, fp)) {
        token = strtok(buffer, "n");
        if (size == current) {
            *vendas = realloc(*vendas, sizeof(vendas[0]) * size * 2);
            size *= 2;
        }
        vendas[current] = strdup(token);
        printf("%d - %d - %sn", current, size, vendas[current]);
        current++;
    }
}

这是事物...使用GDB,它给出了

上的分段故障
vendas[current] = strdup(token);

,但最奇怪的是,它可以用直到 1024的尺寸为止。大小长到1024,然后在1200个元素附近吐出分割故障。我知道问题是在内存重新分配上,因为当我有一个静态数组时,它起作用了。只是不知道什么。

您无法重新分配本地数组,您希望vendas是指向分配的指针的指针:char **vendas = NULL;

您还应包括适当的标头文件并检查fopen()realloc()失败。

这是一个修改版本:

#include <stdio.h>
#include <stdlib.h>
void free_array(char **array, size_t count) {
    while (count > 0) {
        free(array[--count]);
    }
    free(array);
}
int main(int argc, char *argv[]) {
    char buffer[50];
    char **vendas = NULL;
    size_t size = 0;
    size_t current = 0;
    char *token;
    FILE *fp;
    fp = fopen("Vendas_1M.txt", "r");
    if (fp == NULL) {
        printf("cannot open file Vendas_1M.txtn");
        return 1;
    }
    while (fgets(buffer, sizeof buffer, fp)) {
        token = strtok(buffer, "n");
        if (current >= size) {
            char **savep = vendas;
            size = (size == 0) ? 4 : size * 2;
            vendas = realloc(vendas, sizeof(*vendas) * size);
            if (vendas == NULL) {
                printf("allocation failuren");
                free_array(savep, current);
                return 1;
            }
        }
        vendas[current] = strdup(token);
        if (vendas[current] == NULL) {
            printf("allocation failuren");
            free_array(vendas, current);
            return 1;
        }
        printf("%d - %d - %sn", current, size, vendas[current]);
        current++;
    }
    /* ... */
    /* free allocated memory (for cleanliness) */
    free_array(vendas, current);
    return 0;
}    

您只有一个(1)个指针的空间char *vendas[1]。因此,第二次周围的您超出了数组的范围,并且处于不确定的行为土地上。

另外,对realloc的第一个呼叫通过malloc分配的指针通过,因此还有另一种不确定的行为。

相关内容

  • 没有找到相关文章

最新更新