gpt4 book ai didi

C 结构和字符数组。警告 C4820 : '3' bytes padding added after data member

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:31 25 4
gpt4 key购买 nike

我正在构建一个结构来保存电影的信息。打印电影时,它递归地打印其续集​​的信息。

    struct movie
{
char name[28];
int year;
struct movie* sequel;
};

void print_movie(struct movie film)
{
printf("Name: %s \n", film.name);
printf("Year of Release: %d \n", film.year);
if (film.sequel == 0)
{
printf("%s jas no sequel, yet! \n\n", film.name);
}
else
{
printf("%s's sequel was... \n\n", film.name);
print_movie(*film.sequel);
}
}

int main(void)
{
struct movie jurassic;
struct movie lostworld;

strcpy(jurassic.name, "Jurassic Park");
jurassic.year = 1993;
jurassic.sequel = &lostworld;

所有工作都按预期进行,直到这一部分:

strcpy(lostworld.name, "The Lost World: Jurassic Park");
lostworld.year = 1997;
lostworld.sequel = 0;

print_movie(jurassic);

return 0;
}

我计算了“失落的世界:侏罗纪公园”(28) 中的字符数,并将其用作最大缓冲区。问题是,它不是动态的,当我执行程序时,它会打印 The Lost World: Jurassic Par- 并发出错误声音。

如果增加 char 缓冲区,例如,增加到 29,我会得到 Warning C4820: 'movie' : '3' bytes padding added after data member 'name'我在 Visual Studio 中工作,出于学习目的,我已将编译器设置为将警告评估为错误,并且我使用了 _CRT_SECURE_NO_WARNINGS。

这里发生了什么?我应该为 char 使用 malloc 吗?谢谢

最佳答案

C 试图保持事物的边界,因此四字节变量(例如整数)以四的偶数倍开始。编译器将在适当的边界上启动结构,因此您只需担心结构内的变量。当你将你的名字字段运行到 30 以适应“失落的世界:侏罗纪公园”的 29 个字符和终止空时,32 位年份字段被推进到四的偶数倍,留下几个字节浪费空间。

如果我这样做,我会按大小对结构进行排序,首先是指针,其次是整数,最后是数组。我还要确保我的阵列的大小能够使整个阵列达到八的偶数倍。这样,我们就可以拥有一组结构,并且所有内容都将对齐。

是的,malloc 可以工作,但是您必须记住在用完内存后释放内存并担心堆碎片。

关于C 结构和字符数组。警告 C4820 : '3' bytes padding added after data member,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44557381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com