【问题标题】:C problems list of structuresC 问题结构列表
【发布时间】:2017-06-14 15:10:21
【问题描述】:

我有以下结构

struct jucator{
    char nume[100];
    int *salariu;
    struct jucator *urm;
};

struct echipa{
    char nume[100];
    struct jucator *jc;
    struct echipa *urm;
};

struct echipa *ech;

void adaugajuc(char nume[100],char echipa[100],int salariu)
{
    struct echipa *e=ech;
    while(e)
    {
        if(strcmp(e->nume,echipa)==0) break;
        e=e->urm;
    }
    if(e->jc==NULL)
    {
        e->jc=(struct jucator *)malloc(sizeof(struct jucator *));

        *(e->jc->salariu)=salariu;
        e->jc->urm=NULL;
        strcpy(e->jc->nume,nume);
    }
    else{

        struct jucator *jc=e->jc;

        while(jc->urm&&jc->urm->salariu>salariu) jc=jc->urm;

        if(jc==e->jc&&jc->salariu<salariu)
        {
            struct jucator *nod=(struct jucator *)malloc(sizeof(struct jucator *));

            *(nod->salariu)=salariu;
            nod->urm=jc;
            strcpy(nod->nume,nume);
            e->jc=nod;
        }
        else{

            if(jc!=e->jc&&!jc->urm&&jc->salariu>salariu)
            {
                struct jucator *nod=(struct jucator *)malloc(sizeof(struct jucator *));

                *(nod->salariu)=salariu;
                nod->urm=NULL;
                strcpy(nod->nume,nume);
                jc->urm=nod;
            }
            else{

                struct jucator *nod=(struct jucator *)malloc(sizeof(struct jucator *));

                *(nod->salariu)=salariu;
                nod->urm=jc->urm;
                jc->urm=nod;
                strcpy(nod->nume,nume);
            }
        }
    }
} 

我在函数中添加元素。问题是,如果我不将*salariu 放在第一个结构中,而只放入salariu,那么salariu 中将会出现具有奇怪值的元素。
我的问题是为什么?
我指定每个变量都是全局的。
我根据salariu 降序排列它们。
请也解释一下,为什么它会这样工作并且没有指针我会得到奇怪的值(并非总是如此)。

【问题讨论】:

  • 我说它是全球性的
  • 现在你添加了未初始化的。此代码中存在严重问题,并且可能是导致该错误的原因。但我想 that 也不能反映您的实际代码,是吗!?
  • 要改进您的问题,请考虑以下问题:minimal reproducible example

标签: c list struct


【解决方案1】:

salariu 是指向int 的指针:

struct jucator{
    char nume[100];
    int *salariu;
    struct jucator *urm;
};

但是你分配了一个普通的int 没有取消引用(并且没有空间来存储值):

void adaugajuc(char nume[100],char echipa[100],int salariu)
{
struct echipa *e=ech;
while(e)
{
    if(strcmp(e->nume,echipa)==0) break;
    e=e->urm;
}
if(e->jc==NULL)
{
    e->jc=(struct jucator *)malloc(sizeof(struct jucator *));
    e->jc->salariu=salariu; /*HERE */

这里:

demo.c:42:36: warning: comparison between pointer and integer
     while(jc->urm&&jc->urm->salariu>salariu) jc=jc->urm;
                                    ^
demo.c:44:30: warning: comparison between pointer and integer
     if(jc==e->jc&&jc->salariu<salariu)
                              ^
demo.c:48:21: warning: assignment makes pointer from integer without a cast
         nod->salariu=salariu;
                     ^
demo.c:55:44: warning: comparison between pointer and integer
         if(jc!=e->jc&&!jc->urm&&jc->salariu>salariu)

您可以通过取消引用指针来解决此问题:

e->jc->salariu = malloc(sizeof(int)); /* Reseve space for the int */
*(e->jc->salariu)=salariu;

或者更好的是,在struct 中使用普通的int:

struct jucator{
    char nume[100];
    int salariu;
    struct jucator *urm;
};

【讨论】:

  • 但如果我这样做,它会起作用。如果我从 salariu 中删除指针,它将不起作用。为什么?
  • 但是为什么它这样工作并且没有指针不起作用?这是我的问题
  • 因为salariu 需要一个指针,所以当您为其分配int 时,您基本上是在说:object-&gt;salariu 的地址 是x,当你想说object-&gt;salariu 的值 是x,结论:指针想要一个地址,而不是一个值,你有两个选择,在你的@ 中使用一个普通的int 作为成员987654338@,或者为指针保留空间并取消引用,我更喜欢第一种方法。
  • 我的意思是在结构中。如果我根本不使用 salariu 的指针(既不是结构也不是函数),当我显示一些奇怪的值时。为什么?
  • 可以说我在 struct jucator 中没有指针。我像 int salariu 一样使用它。在我完成该函数之后,我在 main 中显示值,我发现有时 salariu 值很奇怪。为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2011-05-30
  • 2021-12-03
  • 2017-06-08
  • 1970-01-01
相关资源
最近更新 更多