如何防止打印结构的下一个变量?

How can I prevent next variable of struct being printed?

这是我的代码:

#include <stdio.h>

struct fruit {

    char one[6];
    char two;

};
typedef struct fruit Fruit;

int main() {

    Fruit *a = (Fruit*) malloc (sizeof(Fruit));
    char* a1 = "apple";
    memcpy(a->one, a1, 6);
    a->two = 'Z';


    Fruit *b = (Fruit*) malloc (sizeof(Fruit));
    char* b1 = "banana";
    memcpy(b->one, b1, 6);
    b->two = 'Z';

    printf("a->one is %s, b->one is %s\n", a->one, b->one);

}

输出是

a->one is apple, b->one is bananaZ

如您所见,当我尝试打印 a->one (apple) 时,没问题。但是当我尝试打印 b->one 时,它​​有它的全尺寸,它到达下一个变量并打印 bananaZ。我怎样才能防止这些事情发生?我想让它在不改变水果结构的情况下打印香蕉。

变化:

memcpy(b->one, b1, 6);

至:

memcpy(b->one, b1, 7);

根据您之前的 memcpy,其中字符串 apple 被复制。在这种情况下,您的字符串中有 5 个字母,但您传递给 memcpy 的长度是 6,以便包括终止字符 [=16=]。同样的逻辑,banana 有 6 个字母,因此为了包含终止字符 [=16=],传递给 memcpy 的长度必须是 7.

want to make it print banana without changing fruit structure.

但这不是正确的政策。如果你想保留长度为 6+ 的单词,你必须改变你的结构。您不能写大于 one 大小的单词。

C 中,字符串以 null 结尾,字符串的最后一个字节必须是 ascii 值 0 => '\0'。

所以如果你想在缓冲区中复制一个 6 字节的字符串,你必须允许 7 个字节,最后一个设置为 0。

你只需要修改

struct fruit {

    char one[6]; //<== put a 7 instead of 6
    char two;

};

一个字符串的结尾是"[=11=]"
如果你设置一个大小为6的字符串并且你的单词是"banana"(6也是)那么你没有"[=11=]" 的位置,然后您开始阅读内存中不需要的内容。