当我在两个函数之间传递变量时,我遇到了一些问题。
我有这样的结构:
typedef struct line{
char *station;
int *time;
struct line *next;
} *Line;
然后是第一个功能:
void readFile(FILE *network, Line *list){
int line;
char station[40];
char next[40];
int time;
char buffer[128];
while(fgets(buffer, 128, network)){
Line newNode = malloc(sizeof(struct line));
sscanf(buffer, "%d, %50[0-9a-zA-Z ], %50[0-9a-zA-Z ], %d", &line, station, next, &time);
newNode->station = malloc(strlen(buffer) + 1);
strcpy(newNode->station, station);
newNode->time = malloc(strlen(buffer) + 1);
newNode->time = &time;
newNode->next = *list;
*list = newNode;
printf("%s %d\n",newNode->station, *newNode->time); // This one print each newNode->time correctly...
}
}
第二功能:
void print(Line cursor){
while(cursor != NULL){
printf("Station: %s ",cursor->station);
printf("Tid: %d\n",*cursor->time);
cursor = cursor->next;
}
}
问题是在print()中,station-variable正在向右循环,但不是时变量。我无法弄清楚为什么......
这是我的函数调用:
int main(){
FILE *network = fopen("network.txt", "r"); // Open file for reading
Line list = NULL;
readFile(network,&list);
printf("%s %d\n",list->next->next->next->station, *list->next->next->next->time);
print(list);
return 0;
}
答案 0 :(得分:4)
问题在于第一个功能。 这段代码:
newNode->time = malloc(strlen(buffer) + 1);
newNode->time = &time;
newNode->next = *list;
首先“newNode-> time”是指向int的指针,因此为字符串分配空间并将其分配给时间是没有意义的。
接下来,您将指向本地变量“time”的指针指向newNode-> time。 这会导致您泄漏刚刚分配的缓冲区空间,因为您不再有指向它的指针。 你可以这样做:
newNode->time = malloc(sizeof(int));
*newNode->time = time;
newNode->next = *list;
哪个应该使代码工作,但我不确定你到底想要做什么。 将Line :: time改为“int time”而不是“int * time”可能更好,那么你不需要为它单独分配。
另外,不要使用malloc / strcpy,只需使用strdup()。
答案 1 :(得分:0)
试试这个
printf("%s %d\n",list->next->next->next->station, ((*list).next)->next->next->time);
我可能会加上一些额外的括号,因为我现在不确定优先顺序。