gpt4 book ai didi

C:链表变量未初始化

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

我对 C 比较陌生,我正在创建一个涉及链表的程序。这是给我带来麻烦的代码的非常简短的版本。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define STRLEN 100

struct Gene {
int num[4];
struct Gene *next;
};
typedef struct Gene item;

void build_list(item *current, item *head, FILE *in);

int main() {

FILE *input;
FILE *output;
input = fopen("test.data", "r");
output = fopen("test.out", "w+");

item *curr;
item *head;
head = NULL;
int i;

build_list(curr, head, input);
curr = head;

while(curr) {
for (i = 0; i < 4; ++i)
fprintf(output, "%d\n", curr->num[i]);
curr = curr->next;
}

fclose(input);
fclose(output);
free(curr);
}

void build_list(item *current, item *head, FILE *in) {

char gene[STRLEN];
char *tok;
char gene_name[STRLEN];
char *search = ",";
int j;

while (fgets(gene, sizeof(gene), in)) {

current = (item *)malloc(sizeof(item));
tok = strtok(gene, search);
strcpy(gene_name, tok);
for (j = 0; j < 4; ++j) {
tok = strtok(NULL, search);
current->num[j] = atoi(tok);
}
current->next = head;
head = current;
}
}

当我尝试编译它时,它说变量 curr 未初始化,但即使我使用 malloc 初始化它,它也会抛出段错误,或者不打印任何内容根本不。为什么会这样?

最佳答案

C 使用按值传递来传递函数参数。因此,当您调用 build_list(curr, head, input); 时,currhead 本身按值传递,并对它们所做的任何更改变量(对应的参数)不会反射回调用者。

因此,在调用者中,

 while(curr)

正在访问调用 undefined behavior 的统一变量 (meeory) .

如果您需要更改 currhead 本身,则需要传递它们的地址并在函数内进行更改。类似的东西

 build_list(&curr, &head, input);

void build_list(item **current, item **head, FILE *in)

*current = malloc(sizeof(item));

可以为您完成工作。

关于C:链表变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329632/

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