2013-01-08 42 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