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

时间:2017-10-26 08:32:06

标签: c string struct memcpy

这是我的代码:

#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-&gt; one(苹果)时,它很好。但是当我尝试打印b->一个具有其全尺寸的一个时,它会到达下一个变量并打印bananaZ。我该如何防止这些事情发生?我想让它在不改变水果结构的情况下打印香蕉。

3 个答案:

答案 0 :(得分:1)

更改:

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

到:

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

相应于之前的memcpy,其中复制了字符串apple。在这种情况下,您的字符串中有5个字母,但传递给memcpy的长度为6,以便包含终止字符\0。在同一逻辑中,banana有6个字母,因此为了包含终止字符\0,传递给memcpy的长度必须为7

  

想要在不改变水果结构的情况下打印香蕉。

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

答案 1 :(得分:1)

你只需要修改

struct fruit {

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

};

字符串的结尾是"\0"
如果你设置一个大小为6的字符串,你的单词是&#34; banana&#34; (6也)然后你没有"\0"的位置,你开始阅读你不想要的东西。

答案 2 :(得分:0)

C中,字符串以空值终止,字符串的最后一个字节必须是ascii值0 =&gt; '\ 0'。

因此,如果要在缓冲区中复制6个字节的字符串,则必须允许7个字节,最后一个字节设置为0。