【问题标题】:Having trouble with array being overwritten数组被覆盖时遇到问题
【发布时间】:2015-03-29 22:53:06
【问题描述】:

我正在尝试将拼字游戏字典加载到内存中,但是当我打印出字典的内容时,它似乎已经用 buf 看到的最后一个字符串重写了我的数据数组中的每个字符串,例如,当我在最后打印出数据数组,数组中的每个条目都是“zzz”,因为它是 scrabble.txt 中的最后一个条目。我不明白为什么它被覆盖?我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#define LEN 100

struct data_t {
    int nval;       /* current number of values in array */
    int max;        /* allocated number of values */
    char **data;        /* the data array */
};

enum {INIT = 1, GROW = 2};

int main(void)
{
    FILE *fp = fopen("scrabble.txt", "r");
    char buf[LEN];
    int i = 0;
    struct data_t *data = malloc(sizeof(struct data_t));
    data->nval = INIT;
    data->max = INIT;
    data->data = NULL;
    while (fgets(buf, LEN, fp)) {
            if (data->data == NULL) {
                    data->data = malloc(LEN);
                    assert(data->data);
            }
            else if (data->nval > data->max) {
                    data->data = realloc(data->data, GROW * data->max * LEN);
                    assert(data->data);
                    data->max = GROW * data->max;
            }
            //printf("%s\n",buf);
            data->data[i] = buf;
            //printf("data->data[%d] = %s ", i, data->data[i]);
            i++;
            data->nval++;
    }
    /* overcounted */
    data->nval--;

    for(i = 0; i < data->nval; i++)
            printf("data->data[%d] = %s", i, data->data[i]);

    fclose(fp);
    free(data->data);
    return 0;
}

【问题讨论】:

  • 顺便说一句data-&gt;data = malloc(LEN);--> data-&gt;data = malloc(sizeof(char*));,还有data-&gt;data = realloc(data-&gt;data, GROW * data-&gt;max * sizeof(char*));

标签: c arrays


【解决方案1】:

你写:

data->data[i] = buf;

这使得指针data-&gt;data[i] 指向缓冲区buf。您每次在循环中都这样做,所以最终您的所有指针都指向buf。所以当你输出每个指针所指向的内容时,它会多次输出buf的内容。

您可能想为每一行使用不同的缓冲区。您将不得不使用malloc 或相关来分配这些缓冲区。例如,将data-&gt;data[i] = buf; 替换为:

data->data[i] = strdup(buf);

strdup 不是标准 C 函数,但如果您的系统没有,您可以在 malloc(strlen(buf)+1) 后跟 strcpy)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多