C中的动态字符串数组结构

时间:2016-12-08 22:04:28

标签: c arrays dynamic struct

我是C的新手,我想创建一个动态数组来存储字符串。我为它编写了下面的代码,但它没有用。数组元素包含一些ASCII字符而不是字符串。 我希望historyArray[0]值为"foo"。我怎么能这样做?

typedef struct {
    char *historyCommand;
    int usedSize;
    int maximumSize;
} HistoryArray;

void CreateHistoryArray(HistoryArray *HistoryArray) {
    HistoryArray->historyCommand = (char *) malloc(sizeof(char) * MAX_LEN);
    HistoryArray->usedSize = 0;
    HistoryArray->maximumSize = INITIAL_SIZE;
}

void ExpandHistoryArray(HistoryArray *HistoryArray, int newSize) {
    int *newArray = (char *) malloc(sizeof(char) * newSize);
    memcpy(newArray, HistoryArray->historyCommand, sizeof(char) * HistoryArray->maximumSize);
    free(HistoryArray->historyCommand);
    HistoryArray->historyCommand = newArray;
    HistoryArray->maximumSize = newSize;
}

void AddHistoryValue(HistoryArray *HistoryArray, char historyCommand[]) {
    strcpy(HistoryArray->historyCommand[HistoryArray->usedSize], historyCommand);

    HistoryArray->usedSize++;

    if (HistoryArray->usedSize == HistoryArray->maximumSize) {
        ExpandHistoryArray(HistoryArray, HistoryArray->maximumSize * 2);
    }
}

void freeHistoryArray(HistoryArray *a) {
    free(a->historyCommand);
    a->historyCommand = NULL;
    a->usedSize = 0;
    a->maximumSize = 2;
}


HistoryArray historyArray;

1 个答案:

答案 0 :(得分:1)

您的代码中存在许多问题。

  1. char *historyCommand是指向单个字符串的指针,而不是字符串数组。对于指向字符串数组的指针,您应该使用char **historyCommand

  2. 创建HistoryArray时,无需为各个字符串分配空间。每次添加到数组时,您都可以使用要添加的字符串的长度来分配适当的空间量。

  3. 您应该使用realloc()而不是调用malloc()memcpy()free()。这样做的好处是,它有时可以简单地扩展已经分配的内存,因此不需要复制。

  4. 当您释放HistoryArray时,您需要释放所有字符串。您不应该免费historyCommand,因为您设置了maximumSize = 2,而其他功能则认为这意味着有2个项目的空间,如果您将historyCommand设置为{ {1}}。因此,您应将其调整为NULL以与其余代码保持一致。

  5. 这是新代码:

    maximumSize