C&;指向结构的指针

C&;指向结构的指针,c,function-call,C,Function Call,大家好, 我开始用C语言编程,也许我的问题看起来很傻,但有什么条件会阻止这个方法的执行吗 现在我正在编写一个使用链表结构的程序,所有的东西都可以编译,但在代码中的某一行之后,程序不会调用方法。 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { char* toFrom; char* meanOfTr;

大家好,

我开始用C语言编程,也许我的问题看起来很傻,但有什么条件会阻止这个方法的执行吗

现在我正在编写一个使用链表结构的程序,所有的东西都可以编译,但在代码中的某一行之后,程序不会调用方法。 这是我的密码:

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

typedef struct node
{
        char* toFrom;
        char* meanOfTr;
        int hours;
        int min;
        double price;
        char* note;
        struct node *next;
}travel;

typedef struct list
{
    travel * head;

}list_t;

void add(list_t *list,char toFrom1[], char meanOfTr1[], char note1[],int hours1,int min1,double price1);
void test();

int main(void) {

    list_t *list;
    test();
    list->head=NULL;
    test();
    char* a="London";//then b,c,h,m,p variables declarations and initialization,which doesn't matter 

    add(list,a,b,c,h,m,p);

    return 0;
}
void test()
{
    printf("test\n");
}


void add(list_t *list,char *toFrom1, char* meanOfTr1, char* note1,int hours1,int min1,double price1)
{

    // Some code here

}
它成功了,希望它能帮助有同样愚蠢问题的人(: 谢谢你的评论,我会考虑一切的

 int main(void) {

   list_t *list;
   test();
   //De-referencing a dangling pointer 
   list->head=NULL;
   test();
请参阅我在代码中的上述注释。您正在反引用一个悬空指针,它是未定义的bahavior,可能导致分段错误

由于您可能是c新手,我将进一步解释:

list\u t*list
不分配任何内存,它所做的只是在堆栈上分配一个位置来存储已分配内存的位置。因此,更广泛地说,
*list
将指向一个有足够空间容纳
list\u t
的位置。您可以创建该空间并将该位置分配给
list

您应该执行以下操作:

 int main(void) {

   list_t *list;
   test();
   list =  malloc(sizeof(list_t));
   //Always check for a null return from malloc!
   if(!list){
    perror("Malloc failed");
   }
   list->head=NULL;
   test();
请参阅我在代码中的上述注释。您正在反引用一个悬空指针,它是未定义的bahavior,可能导致分段错误

由于您可能是c新手,我将进一步解释:

list\u t*list
不分配任何内存,它所做的只是在堆栈上分配一个位置来存储已分配内存的位置。因此,更广泛地说,
*list
将指向一个有足够空间容纳
list\u t
的位置。您可以创建该空间并将该位置分配给
list

您应该执行以下操作:

 int main(void) {

   list_t *list;
   test();
   list =  malloc(sizeof(list_t));
   //Always check for a null return from malloc!
   if(!list){
    perror("Malloc failed");
   }
   list->head=NULL;
   test();

还要记住
free()
malloc在不再需要时分配的内存。这是有道理的,我实际上有malloc,但出于某种原因删除了它。那么关于释放内存,什么时候需要做?我的意思是,当我使用完list或者当我想声明新的list删除之前的列表时,在最后这样做是有道理的。对吗?什么时候完成整个列表后,您必须遍历并释放它。如果删除节点,您也必须释放该节点。还记得
free()
malloc在不再需要时分配的内存。这是有道理的,我实际上有malloc,但出于某种原因删除了它。那么关于释放内存,什么时候需要做?我的意思是,当我使用完list或者当我想声明新的list删除之前的列表时,在最后这样做是有道理的。对吗?什么时候你已经完成了整个列表,你必须运行它并释放它。如果你删除一个节点,你也必须释放该节点。关于你的编辑,不要这样做。这也是未定义的行为!一旦函数超出范围,内存不再可用,你必须通过Malloc将其放在堆上!关于你的编辑,不要这样做。That的未定义行为也是如此!一旦函数超出范围,内存就不再可用,您必须通过Malloc将其放入堆中!