这是我的代码:
#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。我该如何防止这些事情发生?我想让它在不改变水果结构的情况下打印香蕉。
答案 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。