C&;指向结构的指针
大家好, 我开始用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;
#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将其放入堆中!