C 在这段代码中,为什么';ename';是否应为字符指针类型而不是字符数组?

C 在这段代码中,为什么';ename';是否应为字符指针类型而不是字符数组?,c,argv,C,Argv,我想使用命令行参数初始化结构,但我被困在这两者之间,这就是为什么我们必须将ename设置为char指针类型而不是char数组 #include<stdio.h> #include<conio.h> struct emp { int eno; char* ename; int esal; }; int main(int argc,int* argv[]) { struct emp e; e.eno

我想使用命令行参数初始化结构,但我被困在这两者之间,这就是为什么我们必须将ename设置为char指针类型而不是char数组

#include<stdio.h>
#include<conio.h>
struct emp 
    {
      int eno;
      char* ename; 
      int esal;   
    };
int main(int argc,int* argv[])
{
    struct emp e;
    e.eno = (argv[1]);
    e.ename = argv[2];
    e.esal = (argv[3]);
    printf("%d\n",argv[1]); 
    printf("%s\n",argv[2]);
    printf("%d\n",argv[3]);
    return 0;
}
#包括
#包括
结构emp
{
int eno;
char*ename;
国际英语;
};
int main(int argc,int*argv[]
{
结构emp e;
e、 eno=(argv[1]);
e、 ename=argv[2];
e、 esal=(argv[3]);
printf(“%d\n”,argv[1]);
printf(“%s\n”,argv[2]);
printf(“%d\n”,argv[3]);
返回0;
}

您必须从
char*
中获取
int
。简单的解决方案是使用
atoi
,但好的解决方案是使用提供错误检查的
strtol

e.eno = atoi(argv[1]);
对于第二种方法,请使用
strdup
(假设您的系统上有符合POSIX的
strdup

但使用上面显示的方法,可以添加一个级别的错误检查和输入代码验证。您已经使用
gcc-Wall-Werror progname.c
编译器会向您显示警告

为了澄清一点,
e.ename=argv[2]
将衰减的
char*
分配给结构实例的
ename
成员。在本例中,数组被转换为指向char数组的第一个元素的指针。指向第一个元素的指针只不过是
char*
,这就是为什么这里需要
char*
。这不是推荐的做法,因为结构实例会产生超出其成员范围的副作用。更改其成员将影响argv[2],反之亦然

如果将
char
数组或声明
ename
char
数组,则编写此语句将导致错误。因为数组是不可修改的左值。给他们分配东西是违法的

struct emp 
{
  int eno;
  char ename[MAXLENGTH]; 
  int esal;   
};
...
strcpy(e.ename,argv[2]);
在使用
strcpy
之前,请验证
argv[2]
是否包含可复制到指定
char
数组成员中的内容


根据声明的方式,可以使用
ename
成员的不同方式
ename
不必是
char*
-它也可以是
char
数组,但无论您做什么,使用都必须正确

因为您无法分配到数组,就像您在
e.ename=argv[2]
中尝试的那样。请在我回答后不要更改。求你了,对不起@coderredoc
struct emp 
{
  int eno;
  char ename[MAXLENGTH]; 
  int esal;   
};
...
strcpy(e.ename,argv[2]);