鱼C论坛

 找回密码
 立即注册
查看: 398|回复: 14

结构体里面的sizeof

[复制链接]
发表于 2024-1-25 01:19:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc,char const* argv[])
{
        struct students {
                char id[10];
                char name[10];
                int average[3];
                double achievement;
        };
        struct students number[3];
        int i, j, k;
        for (i = 0; i < 3; i++) {
                printf("请输入学号:\n");
                scanf("%s",number[i].id);
                printf("请输入名字:\n");
                scanf("%s",number[i].name);
                printf("请分别输入三门成绩:\n");
                for (j = 0; j < 3; j++) {
                        scanf("%d",&number[i].average[j]);
                }
                k = sizeof(number[1].average);
                number[i].achievement = (number[i].average[0] + number[i].average[1] + number[i].average[2]) / k;
        }
        for (i = 0; i < 3; i++) {
                printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number[i].id, number[i].name, number[i].achievement);
        }
        printf("%d", k);
        return 0;
}
为什么输出k=12,不应该是3吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-25 01:19:48 | 显示全部楼层
在这段代码中,你使用了`sizeof`操作符来计算某个变量或数据类型的大小。然而,你要注意的是`sizeof`计算的是字节数而不是元素的个数。

在这里,你使用`sizeof(number.average)`计算的是`number.average`变量的大小。根据你的代码,`number.average`的类型为`int`,通常占用4个字节(32位系统)或8个字节(64位系统)。所以`k`的值是4或8,而不是3。

如果你想计算数组的元素个数,你可以使用`sizeof`操作符结合除法来计算,例如`sizeof(number)/sizeof(number[0])`。在这里,`sizeof(number)`计算的是整个结构体`number`的大小,而`sizeof(number[0])`计算的是一个结构体元素的大小。通过相除就可以得到结构体数组的元素个数。

希望这个解释能帮到你!如果还有其他问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-1-25 01:21:01 | 显示全部楼层
FishC 发表于 2024-1-25 01:19
在这段代码中,你使用了`sizeof`操作符来计算某个变量或数据类型的大小。然而,你要注意的是`sizeof`计算的 ...

怎么用sizeof 计算int average[3]里面的元素个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:21:37 | 显示全部楼层
-kasha 发表于 2024-01-25 01:21
怎么用sizeof 计算int average里面的元素个数


`sizeof`操作符用于计算数据类型或变量的字节数,而不是元素个数。对于整型变量`int average`而言,它只包含一个整数值,并没有元素的概念。

如果你想要存储多个整数的集合,可以考虑使用数组或者其他数据结构,然后使用`sizeof`来计算数组中元素的个数。例如:

  1. int average[5];
  2. int count = sizeof(average) / sizeof(average[0]);
复制代码


在这个例子中,我们定义了一个包含5个整数的数组`average`。通过将整个数组的字节数除以每个元素的字节数(即`sizeof(average[0])`),我们可以得到数组的元素个数。

需要注意的是,这种方法仅适用于数组。如果`average`是指针或动态分配的内存,`sizeof`操作符将返回指针类型的字节数,而不是指向的数据类型的字节数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-25 01:23:52 | 显示全部楼层
FishC 发表于 2024-1-25 01:21
`sizeof`操作符用于计算数据类型或变量的字节数,而不是元素个数。对于整型变量`int average`而言,它 ...

好的感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:24:01 | 显示全部楼层


不客气,如果还有其他问题,请随时提问。我很乐意帮助你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-25 01:25:57 | 显示全部楼层
FishC 发表于 2024-1-25 01:24
不客气,如果还有其他问题,请随时提问。我很乐意帮助你!

以上回复来自 FishC AI 小助理,如未能正 ...

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(int argc,char const* argv[])
{
        struct students {
                char id[10];
                char name[10];
                int average[3];
                float achievement;
        };
        struct students number[3];
        int i, j, k;
        for (i = 0; i < 3; i++) {
                printf("请输入学号:\n");
                scanf("%s",number.id);
                printf("请输入名字:\n");
                scanf("%s",number.name);
                printf("请分别输入三门成绩:\n");
                for (j = 0; j < 3; j++) {
                        scanf("%d",&number.average[j]);
                }
                k = sizeof(number[1].average) / sizeof(number[1].average[0]);
                number.achievement = (number.average[0] + number.average[1] + number.average[2]) / k;
        }
        for (i = 0; i < 3; i++) {
                printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number.id, number.name, number.achievement);
        }
        printf("%d", k);
        return 0;
}
帮我检测下这个代码 是否有错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:26:58 | 显示全部楼层
-kasha 发表于 2024-01-25 01:25
#define _CRT_SECURE_NO_WARNINGS
#include
int mai ...


在你的代码中,有一个小错误。你声明的`id`和`name`应该是字符数组而不是单个字符。所以你需要将它们的类型改为`char[20]`或其他足够大的数组。

另外,在读取学生信息的部分,你使用`scanf`函数读取字符数组时,应该使用`%s`格式说明符,并且传入数组的地址作为参数,如`scanf("%s", number.id)`。同样适用于`name`和`average`。

此外,你在计算平均成绩时,将`average`变量相加了三次,而没有使用循环来计算所有成绩的总和。你可以使用一个变量来存储总和,然后再计算平均值。

下面是修改后的代码:

  1. #include <stdio.h>

  2. struct students {
  3.     char id[20];
  4.     char name[20];
  5.     int average;
  6.     float achievement;
  7. };

  8. int main(int argc, char const* argv) {
  9.     struct students number;
  10.     int i, j;
  11.     float sum = 0;

  12.     for (i = 0; i < 3; i++) {
  13.         printf("请输入学号:\n");
  14.         scanf("%s", number.id);
  15.         printf("请输入名字:\n");
  16.         scanf("%s", number.name);
  17.         printf("请分别输入三门成绩:\n");
  18.         sum = 0;
  19.         for (j = 0; j < 3; j++) {
  20.             scanf("%d", &number.average);
  21.             sum += number.average;
  22.         }
  23.         number.achievement = sum / 3;
  24.     }

  25.     for (i = 0; i < 3; i++) {
  26.         printf("学号:%s 姓名:%s 平均成绩:%0.3f\n", number.id, number.name, number.achievement);
  27.     }

  28.     return 0;
  29. }
复制代码


现在,代码应该可以正确运行了。希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-25 01:28:30 | 显示全部楼层
FishC 发表于 2024-1-25 01:26
在你的代码中,有一个小错误。你声明的`id`和`name`应该是字符数组而不是单个字符。所以你需要将它们的 ...

我的代码 为什么输出的achievement不是带小数的平均成绩 请帮我修改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:29:05 | 显示全部楼层
-kasha 发表于 2024-01-25 01:28
我的代码 为什么输出的achievement不是带小数的平均成 ...


抱歉,我犯了一个错误。在你的代码中,`average`是用`int`类型来存储成绩,所以计算平均成绩时会自动向下取整。为了显示小数位数的平均成绩,你需要将`average`的类型改为`float`或`double`。此外,你也需要将`achievement`的类型相应地改为`float`或`double`。下面是修改后的代码:

  1. #include <stdio.h>

  2. struct students {
  3.     char id[10];
  4.     char name[20];
  5.     float average;
  6.     float achievement;
  7. };

  8. int main(int argc, char const* argv) {
  9.     struct students number;
  10.     int i, j;
  11.     float sum = 0;

  12.     for (i = 0; i < 3; i++) {
  13.         printf("请输入学号:\n");
  14.         scanf("%s", number.id);
  15.         printf("请输入名字:\n");
  16.         scanf("%s", number.name);
  17.         printf("请分别输入三门成绩:\n");
  18.         sum = 0;
  19.         for (j = 0; j < 3; j++) {
  20.             scanf("%f", &number.average);
  21.             sum += number.average;
  22.         }
  23.         number.achievement = sum / 3;
  24.     }

  25.     for (i = 0; i < 3; i++) {
  26.         printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number.id, number.name, number.achievement);
  27.     }

  28.     return 0;
  29. }
复制代码


现在,代码应该正确计算和显示平均成绩的小数位数。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-25 01:36:43 | 显示全部楼层
FishC 发表于 2024-1-25 01:29
抱歉,我犯了一个错误。在你的代码中,`average`是用`int`类型来存储成绩,所以计算平均成绩时会自动向 ...

如果将我的原有的数据和计算出的平均分数存放在磁盘文件"stud"中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:37:32 | 显示全部楼层
-kasha 发表于 2024-01-25 01:36
如果将我的原有的数据和计算出的平均分数存放在磁盘文 ...


要将学生数据和平均分数存储在磁盘文件中,你可以使用文件操作函数来实现。下面是修改后的代码,添加了文件读写的功能:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct students {
  4.     char id[10];
  5.     char name[20];
  6.     float average;
  7.     float achievement;
  8. };

  9. int main(int argc, char const* argv) {
  10.     struct students number;
  11.     FILE* fp;
  12.     int i, j;
  13.     float sum = 0;

  14.     // 打开文件,如果文件不存在则创建新文件
  15.     fp = fopen("stud", "wb+");
  16.     if (fp == NULL) {
  17.         printf("无法打开文件\n");
  18.         exit(1);
  19.     }

  20.     for (i = 0; i < 3; i++) {
  21.         printf("请输入学号:\n");
  22.         scanf("%s", number.id);
  23.         printf("请输入名字:\n");
  24.         scanf("%s", number.name);
  25.         printf("请分别输入三门成绩:\n");
  26.         sum = 0;
  27.         for (j = 0; j < 3; j++) {
  28.             scanf("%f", &number.average);
  29.             sum += number.average;
  30.         }
  31.         number.achievement = sum / 3;

  32.         // 将学生数据写入文件
  33.         fwrite(&number, sizeof(struct students), 1, fp);
  34.     }

  35.     // 将文件指针移动到文件开头
  36.     rewind(fp);

  37.     printf("学生数据已保存至磁盘文件"stud"中:\n");

  38.     // 从文件中读取并显示学生数据
  39.     while (fread(&number, sizeof(struct students), 1, fp) == 1) {
  40.         printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number.id, number.name, number.achievement);
  41.     }

  42.     // 关闭文件
  43.     fclose(fp);

  44.     return 0;
  45. }
复制代码


修改后的代码会将学生数据按照结构体的大小写入文件中,然后再从文件中读取并显示出来。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-25 01:42:19 | 显示全部楼层
FishC 发表于 2024-1-25 01:37
要将学生数据和平均分数存储在磁盘文件中,你可以使用文件操作函数来实现。下面是修改后的代码,添加了 ...

存放到磁盘文件名字叫"stud"中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 01:43:18 | 显示全部楼层
-kasha 发表于 2024-01-25 01:42
存放到磁盘文件名字叫"stud"中


非常抱歉,我之前的回答有些错误。在代码中,每次循环都会覆盖之前写入文件的数据,导致最后只会保存最后一个学生的数据。为了解决这个问题,我们可以使用数组来存储多个学生的数据,并将整个数组写入文件。

以下是修改后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct students {
  4.     char id[20];
  5.     char name[20];
  6.     float average;
  7.     float achievement;
  8. };

  9. int main(int argc, char const *argv[]) {
  10.     struct students number[3];
  11.     FILE *fp;
  12.     int i, j;
  13.     float sum;

  14.     // 打开文件,如果文件不存在则创建新文件
  15.     fp = fopen("stud", "wb+");
  16.     if (fp == NULL) {
  17.         printf("无法打开文件\n");
  18.         exit(1);
  19.     }

  20.     for (i = 0; i < 3; i++) {
  21.         printf("请输入学号:\n");
  22.         scanf("%s", number[i].id);
  23.         printf("请输入名字:\n");
  24.         scanf("%s", number[i].name);
  25.         printf("请分别输入三门成绩:\n");
  26.         sum = 0;
  27.         for (j = 0; j < 3; j++) {
  28.             scanf("%f", &number[i].average);
  29.             sum += number[i].average;
  30.         }
  31.         number[i].achievement = sum / 3;

  32.         // 将学生数据写入文件
  33.         fwrite(&number[i], sizeof(struct students), 1, fp);
  34.     }

  35.     // 将文件指针移动到文件开头
  36.     rewind(fp);
  37.     printf("学生数据已保存至磁盘文件"stud"中:\n");

  38.     // 从文件中读取并显示学生数据
  39.     for (i = 0; i < 3; i++) {
  40.         fread(&number[i], sizeof(struct students), 1, fp);
  41.         printf("学号:%s 姓名:%s 平均成绩:%0.2f\n", number[i].id, number[i].name, number[i].achievement);
  42.     }

  43.     // 关闭文件
  44.     fclose(fp);

  45.     return 0;
  46. }
复制代码


现在,每个学生的数据都会被正确地写入文件"stud"中,并在最后从文件中读取和显示。希望这次能满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-25 09:44:25 | 显示全部楼层
         average 是含有 3 个 int 的数组,每个 int 占用 4 个字节,那么 4 x 3 = 12,非常合理呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 20:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表