0

所以我有这个功能:

void function (linked_list first, char character){
    linked_list new = NULL;
    new = (linked_list) malloc(sizeof(linked_list));
    new->name[0] = character;
    puts (new->character);
    ...

我的问题是,这将打印出我的角色,然后是一些垃圾,例如 if character = t, puts 将打印 tőú 或类似的东西。

所以我的问题是,如何将 char 放在字符串的末尾,而不会弄乱一切?哦,名称在结构中定义为 char name[256];

4

3 回答 3

2

C 中的字符串需要终止。所以你想做

new->name[0] = character;
new->name[1] = '\0';

否则,您将看到内存中的所有“乱码”(malloc 不会清除内存,因此它指向“那里的任何内容”)。

@self 提出的要点也不是 - 您没有为结构分配足够的内存,而只是为指向结构的指针分配了足够的内存。在现代 C 中(实际上是 C89 之后的任何内容),您不会强制转换 malloc 的结果 - 那是“旧的 K&R”(我知道,因为这是我学到的……)。这些天你应该写

new = malloc(sizeof(*new));

通过使用sizeof(*new),您可以保证尺寸是正确的,即使您改变了new对未来类型的想法……这是最干净的方法(并向@WhozCraig 点头,他在评论中指出了这一点) .

于 2014-01-03T20:33:23.530 回答
1

puts期望字符串为空终止。

如果您只是将一个字符复制到字符串中,请添加一个空终止符:

new->name[0] = character;
new->name[1] = '\0';
puts (new->name);
于 2014-01-03T20:32:24.333 回答
1

假设linked_list 是一个类型定义的指针(它必须是因为你用它转换了你的malloc),那么你的malloc 只为指针分配了足够的空间。您应该为整个结构分配空间。

new = (linked_list) malloc(sizeof(*linked_list));
于 2014-01-03T20:33:59.427 回答