C动态字符串数组

时间:2017-05-19 01:09:51

标签: c arrays string dynamic-arrays

我试图在C中编写一个动态字符串数组的简单实现。这里是我的代码(减去包含和主要功能等...... ):< / p>

typedef char* string;

typedef struct {

    string* list;
    size_t size;
    size_t used;

} list;

void initList(list* l, size_t initSize) {

    l->list = malloc(initSize * sizeof(string));
    l->used = 0;
    l->size = initSize;

}

void insertList(list* l, string elem) {

    if (l->used == l->size) {
        l->size *= 2;
        l->list = realloc(l->list, l->size * sizeof(string));
    }
    l->list[l->used++] = elem;

}

我的代码似乎按照我的预期工作,我问我的问题,因为我读到你应该使用char[]代替char*

我读到使用typedef char* string在只读内存中声明字符串,因此尝试修改它会导致未定义的行为。

如果是这样,使用GCC C编译器我没有收到任何错误或警告,代码似乎在编译时有效。

创建和增长动态数组的函数,从StackOverflow上的另一个问题中获取,原始问题创建了一个动态的整数数组。

我只是好奇我的代码是好/坏的做法。

1 个答案:

答案 0 :(得分:0)

  

我读到使用typedef char * string在只读内存中声明字符串,因此尝试修改它会导致未定义的行为。

嗯,那是胡说八道。您可能会将此与

之类的内容混淆
char *foo = "foo";

在这种情况下,虽然foo是指向可变字符集的可变指针,但它指向的字符不可变。这是因为&#34;字符串文字&#34;在C中总是存在于不可变的记忆中。这里foo不是const,这对我们没有帮助。但是,一个好的编译器会警告你 - 你应该只将字符串文字分配给const char *

如果你想要一个可变字符串,从它初始化一个char[],这样它就不是指针,编译器知道将它放在可变内存中。但这实际上只涉及文字。

因此使用char *作为string类型并没有错。事实上,这就是C对字符串文字隐含的含义。我仍有一点反对意见:经验丰富的C程序员会知道char *等人,他们会期待&#34;普通&#34;字符串为char *(或const char *)。如果你命名string,它应该以某种方式提供更多。如果它没有,那就不要混淆别人,然后去char *