Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗Update the question所以堆栈溢出的值小于aa>。
三年前关闭。
我想写一个简单的c代码来创建一个花园结构,输入诸如动物数量、花园类型和花园大小等细节。
但是,我的代码给了我一些垃圾输出。
#include <stdio.h>
#include <string.h>

struct Garden
{
    int num_animals;
    int size;
    char type[10];
};

void Input(struct Garden gardname)
{
    printf("\nEnter number of animals\n");
    scanf("%d",&gardname.num_animals);

    printf("\nEnter size\n");
    scanf("%d",&gardname.size);

    printf("\nEnter type\n");
    scanf("%s",gardname.type);
}


void Output(struct Garden gardname)
{
    printf("Num of animals:%d\n",gardname.num_animals);
    printf("size:%d\n",gardname.size);
    printf("type:%s\n",gardname.type);
}

int main()
{
    struct Garden Lumbini;
    Input(Lumbini);
    Output(Lumbini);

    return 0;
}

最佳答案

默认情况下,您定义的函数使用传递参数的按值调用方法,这意味着尽管您有要读取和写入元素的Lumbini结构,但您的函数将生成Lumbini(在本例中为gardname)的副本,并写入或打印该副本,而不是Lumbini它可能导致重复的值我用call by reference编写了相同的程序(注意,指向structure的指针是函数中预期的参数,而lumbini的引用是在调用时传递的)这样可以确保不存在重复项,并且只操作相关结构(在本例中为lumbini)。

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

struct Garden
{
    int num_animals;
    int size;
    char an_type[10];
};

void Input(struct Garden *gardname)
{
    printf("\nEnter number of animals\n");
    scanf("%d", &gardname->num_animals);

    printf("\nEnter size\n");
    scanf("%d", &gardname->size);

    printf("\nEnter type\n");
    scanf("%s", gardname->an_type);
}


void Output(struct Garden *gardname)
{
    printf("Num of animals:%d\n",gardname->num_animals);
    printf("size:%d\n",gardname->size);
    printf("type:%s\n",gardname->an_type);
}

int main()
{
    struct Garden Lumbini;
    Input(&Lumbini);
    Output(&Lumbini);

    return 0;
}

获取垃圾值是因为gardname函数中的Outputlumbini结构的未初始化副本的局部变量当您打印出gardname的值时,它们将是垃圾值,因为它们没有初始化当函数完成执行时,gardname被销毁。
而且,不是写作
scanf("%d",&gardname.num_animals)
你必须写信
scanf("%d", &gardname->num_animals)
这将读取指针gardname的地址加上结构中成员num_animals的偏移量。

关于c - 将结构传递给c中的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40407851/

10-10 11:31