+我试图通过引用从主要的CustomStruct数组传递,但我做错了:
我认为我正确地要求记忆,但它似乎并非如此,因为当我试图强迫某些价值观时,我会把核心倾倒,我绝对不知道为什么。< / p>
void readFile(OwnStruct **restaurant){
FILE *f;
int numTaules = 0;
f = fopen("hello.txt", "r");
if(f == NULL){
printf("Error at opening!\n");
exit(0);
}
fscanf(f,"%d",&numTaules);
//Asking for memory
*restaurant = (OwnStruct*)malloc(sizeof(OwnStruct) * numTaules);
//From here, at some point: Core Dumped
restaurant[0]->ocupades = 1;
restaurant[0]->disponibles = 2;
restaurant[1]->ocupades = 3;
restaurant[1]->disponibles = 4;
printf("%d\n",restaurant[0]->ocupades);
printf("%d\n",restaurant[0]->disponibles);
printf("%d\n",restaurant[1]->ocupades);
printf("%d\n",restaurant[1]->disponibles);
}
int main(){
typedef struct(){
int ocupades;
int disponibles;
}
OwnStruct *restaurant;
readFile(&restaurant);
return 0;
}
答案 0 :(得分:3)
您引用的数组错误:
到目前为止一切顺利:
*restaurant = (OwnStruct*)malloc(sizeof(OwnStruct) * numTaules);
这是错误的:
restaurant[0]->ocupades = 1;
应该是:
(*restaurant)[0].ocupades = 1;
您必须取消引用指向指针的指针。然后该表达式指向已分配数组的第一个元素。括号是必需的,因为像EXPR[0]
这样的后缀运算符优先于*EXPR
等一元运算符,因此*EXPR[0]
被视为*(EXPR[0])
。
建议:使用仅Ownstruct *ptr
的本地指针。然后,在从函数返回之前,存储指针:
*restaurant = ptr;
然后您可以在函数中使用ptr[0]->field = value
类型代码。
答案 1 :(得分:1)
你的问题是你的功能
void readFile(char fileName[], OwnStruct **restaurant)
需要两个参数,但只传递一个参数。
readFile(&restaurant);
只需写下
readFile("myFile.txt", &restaurant);
或将您的功能定义为
void readFile(OwnStruct **restaurant)
答案 2 :(得分:0)
您提供的示例当前不应该编译 - readFile需要一个文件名和一个指向OwnStruct指针的指针。你的主要是提供指针。
结构应该在顶部的某处定义(在main和readFile中使用之前)
readFile也从文件读取numTauls,但假设在为分配的内存分配值时至少为2。