如何防止打印结构的下一个变量?
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=]"
的位置,然后您开始阅读内存中不需要的内容。
这是我的代码:
#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=]"
的位置,然后您开始阅读内存中不需要的内容。