函数结构的未初始化指针

时间:2017-05-19 17:52:10

标签: c arrays pointers data-structures structure

我正在尝试学习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。如果我错了,我怎么能解决这个问题?

2 个答案:

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

或者您可以将指针传递给指向函数的指针,如其他答案中所述。