【发布时间】:2016-04-06 19:59:14
【问题描述】:
我有一个这样的结构:
typedef struct TEXT {
char *text;
struct TEXT *next;
} TEXT;
在某些功能中,我有类似的东西:
TEXT *line = (TEXT *) malloc(sizeof(TEXT));
line->text = NULL; // was "\0" before
char current = getchar();
while (current != '\n') {
AddChar(&(line->text), current); // Was AddChar(line->text, current);
current = getchar();
}
AddChar 函数是这样的:
void AddChar(char **text, char c) { //was char *text
*text = (char *) realloc(*text, strlen(*text)+2); //was text = ...
char char_array[2] = {c, '\0');
strcat(*text, char_array); //was strcat(text, char_array);
}
不幸的是,程序崩溃了。
据我了解,strlen 无法计算出如果 text == NULL,则长度应为 0...
无论如何,有了这个 AddChar 函数,一切正常:
void AddChar(char **text, char c) {
if (*text == NULL) {
*text = (char *) malloc(2);
(*text)[0] = c;
(*text)[1] = '\0';
}
else {
*text= (char *) realloc(*text, sizeof(*text)+2);
char char_array[2] = { c , '\0' };
strcat(*text, char_array);
}
}
.
.
我也有问题
void AddChar(char *text, char c) {
text = "something";
}
不改变 line->text,但将 *text 更改为 **text 解决了这个问题。
【问题讨论】:
-
因为你不能重新分配字符串文字。
-
不要将
malloc和朋友的结果投射到 C 中! -
不要在标题中添加“[已解决]”。要表明您的问题已解决,请接受答案。如果现有答案都没有解决您的问题,您可以发布并接受您自己的答案。
-
strlen()在空指针上具有未定义的行为。它不返回 0,因为没有字符串。 -
请注意,
getchar()返回一个int,您需要测试 EOF 以及'\n'。
标签: c string pointers struct null-terminated