在函数之间传递指针

时间:2013-10-01 20:55:39

标签: c function pointers

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

我有这样的结构:

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

2 个答案:

答案 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);

我可能会加上一些额外的括号,因为我现在不确定优先顺序。