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


struct a
{
    a * next;
    double v;
};


void add(struct a* list,double d)
{
    if(!list->next) goto exception; //I know that a lot of programmers have a low opinion about "goto"

    list=list->next;

    list->v=d;

    return;

exception:
    printf("Cannot add a new element to the list\n");
}

int main()
{
    struct a l;
    double j;
    int i;

    for(j=1.0; j<10.0; j+=1.0)
    {   
        l.next= (a*)malloc(sizeof(a));
        add(&l,j);
        printf("%lf ",l.v);
    }
    return 0;
}

このプログラムは をコンパイルしますが、出力に混乱があります。

-92559631349317831000000000000000000000000000000000000000000000.000000 -92559631 349317831000000000000000000000000000000000000000000000.000000 -92559631349317831 000000000000000000000000000000000000000000000.000000 -92559631349317831000000000 000000000000000000000000000000000000.000000 -92559631349317831000000000000000000 000000000000000000000000000.000000 -92559631349317831000000000000000000000000000 000000000000000000.000000 -92559631349317831000000000000000000000000000000000000 000000000.000000 -92559631349317831000000000000000000000000000000000000000000000 .000000 -92559631349317831000000000000000000000000000000000000000000000.000000

望ましいのは次のとおりです。

1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0

間違いはどこにあり、どのように修正するのですか?

4

1 に答える 1

7

問題は、がに値を割り当てるように、 l.vin に値が割り当てられないことです。toの割り当ては呼び出し元には表示されないため、 inは常に の同じインスタンスです。が同じ unitialized を印刷していることを意味します。main()add()l.nextlistlist->nextlmain()struct aprinf()double

その他のポイント:

  • l正しく初期化:

    struct a l = { NULL, 0 };
    
  • malloc()withinのnextインスタンスのメモリを確保し、すべてのメンバーを初期化します。struct aadd()
  • たとえば、最新のアドレスを返すことにより、 の最新のnextものにアクセスします。main()struct aadd()
  • の戻り値をキャストしないでくださいmalloc()(そして C コンパイラを使用します)。
于 2013-01-08T12:10:53.687 に答える