繁体   English   中英

C中的嵌套结构和指针

[英]Nested structures and pointers in C

编译器有两个抱怨:

错误:“打印输出”的参数1的类型不兼容

警告:预期的结构用户*但参数的类型为'users'

我该如何解决? 并且请检查功能printout是否正常。

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

typedef struct{
   char username[25];
   char firstname[25];
   char lastname[25];
   int age;
}users;

typedef struct{
   users data;
   int id;
}publicusers;

users createuser(char *uname, char *fname, char *lname, int fage);
void printout(users *data);

int main(){
    printout(createuser("kway","minseon","huh", 25));
    return 0;
}

users createuser(char *uname, char *fname, char *lname, int fage){
    publicusers user1;
    strcpy(user1.data.username, uname);
    strcpy(user1.data.firstname, fname);
    strcpy(user1.data.lastname, lname);
    user1.data.age = fage;
    return user1.data;
}

void printout(users *data){
    printf("username:  %s\n",data->username);
    printf("firstname: %s\n",data->firstname);
    printf("lastname:  %s\n",data->lastname);
    printf("age:       %d\n",data->age);
}

您的createuser函数返回users类型,并且函数printout users*作为其参数,这是指向users的指针。

因为要在createuser函数中声明struct publicusers user1 ,所以不能将其地址作为返回值发送。 快速的解决方案是将函数定义从以下位置更改:

void printout(users *data);
void printout(users *data){
   printf("username:  %s\n",data->username);
   printf("firstname: %s\n",data->firstname);
   printf("lastname:  %s\n",data->lastname);
   printf("age:       %d\n",data->age);
}

void printout(users data);
void printout(users data){
   printf("username:  %s\n",data.username);
   printf("firstname: %s\n",data.firstname);
   printf("lastname:  %s\n",data.lastname);
   printf("age:       %d\n",data.age);
}

这将创建struct users的副本。 如果要避免创建副本,则应考虑在主目录中创建publicusers user1并将其作为附加参数发送给users createuser函数。

您的警告和错误消息是从以下行生成的:

printout(createuser("kway","minseon","huh", 25));

函数printout期望user *类型值作为其参数,但函数createuser返回user类型值。

要解决此问题,您应该使用&运算符将user *类型值作为参数传递。 将以上一行代码更改为两行代码:

users u = createuser("kway","minseon","huh", 25);
printout(&u);

还有另一种解决方法。 您可以将功能printout的参数类型从user *更改为user

您的代码应为:

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

typedef struct{
   char username[25];
   char firstname[25];
   char lastname[25];
   int age;
}users;

typedef struct{
   users data;
   int id;
}publicusers;

users createuser(char *uname, char *fname, char *lname, int fage);
void printout(users data);                     // parameter type changed

int main(){
    printout(createuser("kway","minseon","huh", 25));
    return 0;
}

users createuser(char *uname, char *fname, char *lname, int fage){
    publicusers user1;
    strcpy(user1.data.username, uname);
    strcpy(user1.data.firstname, fname);
    strcpy(user1.data.lastname, lname);
    user1.data.age = fage;
    return user1.data;
}

void printout(users data){                     // parameter type changed
    printf("username:  %s\n",data.username);   // -> operator changed to . operator
    printf("firstname: %s\n",data.firstname);  // -> operator changed to . operator
    printf("lastname:  %s\n",data.lastname);   // -> operator changed to . operator
    printf("age:       %d\n",data.age);        // -> operator changed to . operator
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM