C 指针和结构问题

C 指针和结构问题,c,pointers,struct,C,Pointers,Struct,函数find_young()必须接收指针p作为实际参数。 而p必须指向一个struct s,其中有最年轻的人。 没有错误消息,但程序不工作。 请给我一些建议 typedef struct { char *name; int age; } PERSON; void find_young(PERSON **ip) { PERSON s[3] = {{"John", 25}, {"Brandon", 28}, {"Alex", 30}}; int i; int

函数
find_young()
必须接收指针
p
作为实际参数。 而
p
必须指向一个
struct s
,其中有最年轻的人。 没有错误消息,但程序不工作。 请给我一些建议

typedef struct
{
    char *name;
    int age;
} PERSON;

void find_young(PERSON **ip)
{
    PERSON s[3] = {{"John", 25}, {"Brandon", 28}, {"Alex", 30}};
    int i;
    int min = s[0].age; 
    for(i = 0; i < 3; i++)
    {
        if(min > s[i].age)
            **ip = s[i];
    }
}

int main()
{
    PERSON *p;
    find_young(&p);
    printf("The youngest person is %s.\n", p->name);
}
typedef结构
{
字符*名称;
智力年龄;
}人;
无效查找年轻人(个人**ip)
{
人s[3]={{“约翰”,25},{“布兰登”,28},{“亚历克斯”,30};
int i;
int min=s[0]。年龄;
对于(i=0;i<3;i++)
{
如果(最小值>s[i].年龄)
**ip=s[i];
}
}
int main()
{
个人*p;
寻找_young&p;
printf(“最年轻的人是%s.\n”,p->name);
}

您需要对代码进行大量更改才能使其正常工作


1) 您需要为结构中的
char*name
分配内存

int main()
{
    PERSON *p = malloc(sizeof(PERSON));
    p->name = malloc(100);
    find_young(&p);
    printf("The youngest person is %s with age %d.\n", p->name, p->age);

    free(p->name);
    free(p);
}

2) 然后您需要将
name
age
值正确复制到传递的
struct

void find_young(PERSON **ip)
{
    PERSON s[3] = {{"John", 25}, {"Brandon", 28}, {"Alex", 30}};
    int i;

    int min = s[0].age;             //copying the first value
    (**ip).age = s[0].age;
    strcpy((**ip).name, s[0].name);

    for(i = 1; i < 3; i++)          //starting from the next values to compare
    {
        if(min > s[i].age)
        {
            (**ip).age = s[i].age;
            strcpy((**ip).name, s[i].name);
        }
    }
}
void find_young(个人**ip)
{
人s[3]={{“约翰”,25},{“布兰登”,28},{“亚历克斯”,30};
int i;
int min=s[0].age;//复制第一个值
(**ip.年龄=s[0].年龄;
strcpy((**ip).name,s[0].name);
对于(i=1;i<3;i++)//从下一个要比较的值开始
{
如果(最小值>s[i].年龄)
{
(**ip).age=s[i].年龄;
strcpy((**ip).name,s[i].name);
}
}
}
在您的代码中

  • 对于
    p
    ,在将
    &p
    传递给函数之前
  • 或者,对于
    *ip
    ,在函数内部

你需要分配内存。另一方面,您将取消对无效指针的引用,该指针将调用-->
人p
s[0]
在最小值时未设置。您能更简单地解释一下吗?如果我必须使用双指针,我该怎么办?您的指针尚未设置,应将指针指向对象(PERSON对象)。例如
人和人;PERSON*p=&aMan
请注意,在
main()
函数的printf之后包含
free()
语句是最佳做法。否则,如果在此之后程序没有终止,则会导致内存泄漏。@Magisch,我总是错过这一点。:)