我试图在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上的另一个问题中获取,原始问题创建了一个动态的整数数组。
我只是好奇我的代码是好/坏的做法。
答案 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 *
。