struct fish {
int weight;
}fish;
推荐这么写吗?
在C语言中,推荐使用如下方式定义结构体:
struct fish {
int weight;
};
int main() {
struct fish myFish;
myFish.weight = 10;
// 其他操作...
return 0;
}
在上述代码中,我们首先使用struct fish
定义了一个结构体类型fish
,其中包含了一个整型成员weight
。接着,在main
函数中,我们创建了一个结构体变量myFish
,并通过.
运算符对结构体成员进行访问和赋值。
使用这种方式定义结构体可以确保结构体类型与结构体变量的命名不会冲突,也符合C语言的语法规范。
不推荐这么写!
一般常用以下两种写法,有疑问可以私聊
typedef struct {
int weight;
}fish_struct;
或者
typedef struct fish {
int weight;
};
GPT3.5的回答
在C语言中,结构体名和别名一样可能会导致代码可读性下降,但并不会导致程序出错。使用别名可以方便地引用结构体类型,但是如果别名和结构体名相同,就会让代码难以理解和维护。
例如,下面的代码定义了一个结构体和一个别名,它们的名称相同:
typedef struct student {
char name[20];
int age;
} student;
在这个例子中,结构体名和别名都叫做"student"。这样虽然可以方便地引用结构体类型,但是在代码中使用时,可能会让人感到困惑和不清晰。
为了提高代码的可读性和可维护性,建议给结构体和别名取不同的名称。例如:
typedef struct student_info {
char name[20];
int age;
} student;
在这个例子中,结构体名为"student_info",别名为"student"。这样可以让代码更加清晰易懂,提高代码的可读性和可维护性。
不知道你这个问题是否已经解决, 如果还没有解决的话:这里就是涉及到标题了,为何要把不使用的读写端关闭,上面的程序没有把父进程对pipe读写端关闭,使得读写端的计数在最小的时候都>0。
当pipe写端引用计数>0时,读端读完管道里的数据后会阻塞等待写端写入。
当pipe写端引用计数为0时,读端读完数据直接返回0,进程结束。
所以当父进程没有关闭读写端的时候,wc进程读完管道里的内容后会阻塞等待父进程写端写入,而我们程序的父进程明显没有写的操作,所有wc就会一直阻塞等待了。
但是为何没有while循环就会有正常的结果输出?
当一个进程结束后,会释放掉它所占有的文件描述符和用户空间,只保留pcb,里面保存着导致它结束的信号,变成僵尸进程等待父进程收尸。所以没有while循环的话当父进程结束后,pipe写端的引用计数就变为0,wc进程就不会阻塞等待了,所以就会有正常结果输出。
所以,我们加入父进程对于pipe读端写端的close操作就好了
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
while(1)
{
pid_t pid;
int fp[2];
int ret=pipe(fp);
int i;
char *s[5];
char *t[5];
s[0]="ls";
s[1]="-l";
s[2]=NULL;
t[0]="wc";
t[1]=NULL;
for(i=0;i<2;i++)
{
pid=fork();
if(pid==-1)
{
perror("pid error:");
exit(1);
}
if(pid == 0){
break;
}
}
if(i == 0)
{
close(fp[0]);
dup2(fp[1],STDOUT_FILENO);
execvp(s[0],s);
}
else if(i == 1){
close(fp[1]);
dup2(fp[0],STDIN_FILENO);
execvp(t[0],t);
}
int set;
if(pid > 0){
do{
close(fp[0]);
close(fp[1]);
set = waitpid(-1,NULL,WNOHANG);
}while(set == 0);
}
}
return 0;
}
可以看到输出正确
综上,在我们使用管道进行进程间通信时,一定要对不使用的读写端进行close操作,否则会因为读写端引用计数>0,出现一些BUG。
答案:
在定义结构体时,类型名和结构体名相同不会有问题,可以这样定义结构体。例如:
struct Student { char name[20]; int age; };
其中,"Student"既是类型名也是结构体名。
解释:C语言中使用struct关键字定义结构体类型时,需要在类型名前添加struct关键字,例如"struct Student"。但是,为了方便使用,可以省略struct关键字,即直接使用类型名Student来定义变量和指针。因此,类型名和结构体名相同是合法的。
代码示例:
typedef struct Student { char name[20]; int age; } Student;
其中,"Student"既是类型名也是结构体名,使用typedef关键字可以定义类型别名,这里定义了一个类型别名为Student,用于方便定义变量和指针。