gpt4 book ai didi

c - 在函数之间传递指针

转载 作者:行者123 更新时间:2023-11-30 20:02:20 24 4
gpt4 key购买 nike

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

我有一个这样的结构:

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

最佳答案

问题出在第一个函数中。这段代码:

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

关于c - 在函数之间传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com