char 和 char [1] 有什么不同?

问题描述 投票:0回答:1
#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”只是一个字符,因此它会像普通变量一样在结构中工作。

#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. 为什么 char sex 在结构中不起作用?

我搜索但找不到答案。帮助我!

arrays c struct char
1个回答
0
投票

char
是标量类型,而
char[1]
是具有 ine 元素的数组类型。
"M"
是一个字符串文字,具有字符数组
char[2]
,在内存中的存储方式类似于
{ 'M', '\0' }

在此声明中

std.sex="M";

您正在尝试将数组(字符串文字)

"M"
分配给类型为
std::sex
的标量对象
char
。在此赋值中,字符数组被隐式转换为指向其第一个元素的指针。其实你有

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);
              ^^

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

char sex[1];

然后这个电话

strcpy

strcpy(std.sex, "M");

写入数组外部的内存

sex
,因为如上所述,字符串文字
"M"
有两个元素。

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

char sex[2];

虽然您只使用一个字符,但足以声明数据成员

sex

char sex;

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

© www.soinside.com 2019 - 2024. All rights reserved.