#include <stdio.h>
#include <string.h>

struct Student {
  int id;
  char name[10];
  char sex;
  int grade;
};

int main() {
  struct Student std;
  std.id = 1;
  strcpy(std.name, "Kevin");
  std.sex="M";
  std.grade = 2;
  printf("%d %s %s %d\n", std.id, std.name, std.sex, std.grade);
}

在此代码中,在STD变量中分配性别字符时出错. 我以为‘M’只是一个字符,所以它会像普通变量一样在 struct 上起作用.

#include <stdio.h>
#include <string.h>

struct Student {
  int id;
  char name[10];
  char sex[1];
  int grade;
};

int main() {
  struct Student std;
  std.id = 1;
  strcpy(std.name, "Kevin");
  strcpy(std.sex, "M");
  std.grade = 2;
  printf("%d %s %s %d\n", std.id, std.name, std.sex, std.grade);
}

我修复了这样的代码,然后它就能工作了.

所以我的问题是,

  1. 在内存透视中,char和char [1]有什么不同?
  2. 为什么字符性在 struct 中不起作用?

我找了,但找不到答案.帮帮我!

推荐答案

char是标量类型,而char[1]是具有一个元素的数组类型. "M"是具有字符数组类型char[2]的字符串文字,并且与{ 'M', '\0' }一样存储在内存中.

你可以用这个printf的电话来判断

printf( "sizeof( \"M\" ) = %zu\n", sizeof( "M" ) );

在本声明中

std.sex="M";

您正try 将数组(字符串文字)"M"赋给类型char的标量对象std::sex.在此赋值中,字符数组被隐式转换为指向其第一个元素的指针.事实上,你有

std.sex = &"M"[0];

虽然你至少需要像这样写

std.sex = "M"[0];

尽管使用整数字符常量来代替字符串文字会更简单明了,比如

std.sex = 'M';

相应地,在printf的调用中,您应该使用转换说明符c而不是s来输出单个字符

printf("%d %s %c %d\n", std.id, std.name, std.sex, std.grade);
              ^^

在第二个程序中,数据成员sex被声明为具有一个元素的数组

char sex[1];

然后这通strcpy的电话

strcpy(std.sex, "M");

写入数组sex外部的内存,因为如上所述,字符串文字"M"具有两个元素.因此,第二个程序也是无效的.它似乎仅由于数据部件int grade;的对准才起作用,即编译器在数据部件sex之后插入额外的字节以提供对准.

您可以像这样声明字符数组

char sex[2];

但是,由于您将只使用一个字符,因此将数据成员sex声明为

char sex;

并按照上面第一个程序的注释中所示的方式使用它.

请注意,您可以通过以下方式在声明中初始化 struct 类型的对象

struct Student std = 
{
    .id = 1, .name = "Kevin", .sex = 'M', .grade = 2
};

struct Student std = 
{
    1, "Kevin", 'M', 2
};

C++相关问答推荐

函数指针始终为零,但在解除引用和调用时有效

CC crate 示例不会与C函数链接

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么在C中进行大量的位移位?

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

如果我释放其他内容,返回值就会出错

识别和处理c中整数溢出的最佳方法?

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

限制不同类型的限定符

将 struct 传递给函数

是否需要包括<;errno.h>;才能使用perror?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

MacOS下C++的无阻塞键盘阅读

理解bzip2的BZ2_解压缩函数中的状态重新分配

试图创建一个基本的Word克隆,但遇到了障碍

pthread_create的用法

try 查找带有指针的数组的最小值和最大值

即使客户端不发送数据,也会发生UNIX套接字读取

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

为什么需要struct in_addr