我正在尝试学习C编程,但是当我试图将未初始化的结构指针传递给函数时,我遇到了困难。
这是我的结构:
typedef struct {
char name[30];
char surname[30];
char gender;
char DOB[10];
int waist;
int hip;
}healthcare_table;
我的主要
int main() {
healthcare_table *records;
int step = 1;
load_healthcare_table(records,&step);
return 0;
}
我的函数将打开文件,并根据文本文件中的行数,它将初始化指针,但我不能这样做。有什么建议吗?
更新: 我正在接受这样的错误,我不知道出了什么问题。 错误消息是:在ConsoleApplication1.exe中0x00D7529C处抛出异常:0xC0000005:访问冲突读取位置0x0000004C。
这是我更新的代码:
typedef struct {
char name[30];
char surname[30];
char gender;
char DOB[10];
int waist;
int hip;
}healthcare_table;
void load_healthcare_table(healthcare_table **t, int *step) {
int i;
FILE *infile;
infile = fopen("records.txt", "r");
if (infile == NULL)
printf("File not opened successfully");
else
printf("File opened successfully");
for (i = 0; fscanf(infile, "%s %s %c %s %d %d", *t[*step]->name, *t[*step]->surname, t[*step]->gender, *t[*step]->DOB, t[*step]->waist, t[*step]->hip) != EOF; i++) {
if (fgetc(infile) == '\n') {
*step++;
//*t = (healthcare_table*)realloc(*t, *step);
//fprintf(infile, "%s %s %c %s %d %d", *t[*step]->name, *t[*step]->surname, t[i]->gender, *t[*step]->DOB, t[*step]->waist, t[*step]->hip);
}
}
*t = (healthcare_table*)malloc((*step) * sizeof(healthcare_table));
for (i = 0; fscanf(infile, "%s %s %c %s %d %d", *t[i]->name, *t[i]->surname, t[i]->gender, *t[i]->DOB, t[i]->waist, t[i]->hip) != EOF; i++) {
if (fgetc(infile) == '\n')
fprintf(infile, "%s %s %c %s %d %d", *t[i]->name, *t[i]->surname, t[i]->gender, *t[i]->DOB, t[i]->waist, t[i]->hip);
}
}
void display_healthcare_table(healthcare_table *records) {
}
void search() {
}
void WHR_interpreter() {
}
int main() {
healthcare_table *records=NULL;
int step = 0;
load_healthcare_table(&records, &step);
return 0;
}
更新2: 我认为问题是fscanf和fprintf。如果我错了,我怎么能解决这个问题?
答案 0 :(得分:0)
如果您不想在main函数中分配指针,则有两种可能的解决方案:
解决方案1
不要将healthcare_table指针传递给load_healthcare_table()函数,而是从函数本身返回初始化指针。这些方面的东西:
int main() {
healthcare_table *records;
int step = 1;
records = load_healthcare_table(&step);
return 0;
}
在这种情况下,你的load_healthcare_table()函数将是:
healthcare_table* load_healthcare_table(int* step) {
healthcare_table *table;
table = (healthcare_table*)malloc(sizeof(healthcare_table));
// Fill table here
return table;
}
重要提示 在这种情况下,请确保不在本地创建表到load_healthcare_table()函数。一旦函数返回,这将破坏表,从而导致垃圾数据。函数永远不应返回指向其本地数据的指针。因此,以下示例将错误:
healthcare_table* load_healthcare_table(int* step) {
healthcare_table table;
// Fill table here
return &table;
}
解决方案2
将指向医疗保健表的指针传递给函数load_healthcare_table()。它看起来像这样:
int main() {
healthcare_table *records;
int step = 1;
load_healthcare_table(&records,&step);
return 0;
}
在这种情况下,load_healthcare_table()函数将是:
void load_healthcare_table(healthcare_table** t, int* step ) {
*t = (healthcare_table*)malloc(sizeof(healthcare_table));
// Fill table here
}
修改强>
正如Ajay Brahmakshatriya所建议的那样:坚持局部变量的标准C概念,而不是进入堆栈术语。
答案 1 :(得分:0)
虽然将未初始化的指针传递给函数是没有用的,但是只要传递一个未分配的指针就可以了:
realloc()
为指针重新分配内存,或在使用malloc()
之前检查它是否为空指针。示例代码段(假设定义了结构a_struct
):
a_struct *a_funct(a_struct *p);
int main(void)
{
struct a_struct *p_a_struct = NULL;
p_a_struct = a_funct(p_a_struct);
return 0;
}
a_struct *a_funct(a_struct *p)
{
// Does some stuff to find how many records p should point to.
p = realloc(p, sizeof a_struct * number_of_records);
// Check p for error.
// Do more stuff?
return p;
}
或者您可以将指针传递给指向函数的指针,如其他答案中所述。