所以我有这一点代码
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
分配的指针通过,因此还有另一种不确定的行为。