-2

当我在两个函数之间传递一个变量时,我遇到了一些问题。

我有一个这样的结构:

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() 中,站变量正确循环,而不是时间变量。我想不通为什么...

这也是我的函数调用:

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;
}
4

2 回答 2

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()。

于 2013-10-01T21:06:22.473 回答
0

尝试这个

printf("%s %d\n",list->next->next->next->station, ((*list).next)->next->next->time);

我可能已经添加了一些额外的括号,因为我现在不确定优先级。

于 2013-10-01T21:09:27.947 回答