通过引用C传递Struct *

时间:2016-05-09 20:54:10

标签: c

+我试图通过引用从主要的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;
}

3 个答案:

答案 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。