2013-01-08 75 views
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 0.000000 -92559631349317831000000000000000000000000000000000000000000000.000000

鑑於期望是:

1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0

哪裏是錯誤和如何解決它?

+1

我不相信該程序編譯。另外,不要施加'malloc'的結果。 –

+2

@KerrekSB,猜測一個C++編譯器正被用來解決'malloc()'中缺少'struct'關鍵字和從'malloc()'中返回值的轉換。 – hmjd

+0

@hmjd:在這種情況下,我應該推薦使用'std :: list ':-) –

回答

7

的問題是,在l.vmain()從未分配一個值作爲add()分配值l.next。到list->next的分配對於呼叫者不可見,所以lmain()中始終是struct a的相同實例。意思是prinf()正在打印相同的單元化的double

其他景點:

  • 正確初始化l

    struct a l = { NULL, 0 }; 
    
  • malloc()內存的struct aadd()next實例和intialize所有成員。
  • 例如,通過從add()返回最新的struct a的地址來訪問main()中的最近的next
  • Don't cast the return value of malloc()(並使用C編譯器)。
+0

代碼中的很多問題.. 1)遍歷節點及其元素的問題。 2)內存管理你malloc但不免費 3)你不需要轉到你可以使用if-else梯子 嘗試搞清楚,否則我會幫助明天 – nimish

+0

'列表分配給list-> next是不可見的來電者 - 爲什麼?通過引用將列表l傳遞給add()函數... – 0x6B6F77616C74

+0

@ 0x6B6F77616C74,'main()'中的'l'不會被'list = list-> next'更改,因爲C中的所有內容都按值傳遞,包括指針。如果你想改變'l'指向的內容,你需要使用'l'作爲指針並傳入指針地址(因此參數類型應該是'struct a **')。見http://c-faq.com/ptrs/passptrinit.html – hmjd