C - 将struct成员的地址传递给函数错误返回

时间:2015-01-15 20:30:22

标签: c pointers struct mmap

答案:

罪魁祸首是关键字限制。我错过了演员 感谢

上下文

Linux操作系统。

问题

你能帮我找一个优秀的解决方案来编写我的参数吗?

为什么我失败

我失败了因为我不想采取正常的路径(见代码)。

我的需要

像&(data-> mmap)这样的一些非常优雅的参数,以避免创建一个虚拟变量,就像以我的方式暴露出来来规避问题一样。

这实际上不起作用。

我必须这样做,因为可以用不同的含义调用该函数。 结构要复杂得多,根据我在代码中的位置,第二个参数不一样。

代码

struct mystruct {
 char * mmap;
}
void test(mystruct * _input, char * my_char){

 int fd;
 ...
 // WORKS FINE. THE ADDRESS IS PRINTED IN mySecondFunction CORRECTLY.
 // THAT IS THE OBVIOUS WAY
 //_input->_mmap = (char*)mmap( 0 , 128 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );

 // FAILS TO PRINT THE RIGHT ADDRESS IN mySecondFunction
  my_char = (char*)mmap( 0 , 128 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );
 ...

 printf("in function address %p\n", my_char);

}
void mySecondFunction(mystruct * data){

 test(data, data->mmap);
 printf("data->mmap %p\n",data->mmap);

}
int main(void){

 mystruct test;

 mySecondFunction(&test);


 return 0;
}

我处理这种情况的方法

void test(mystruct * _input, char ** my_char){

   ...
   * my_char = (char*)mmap( 0 , 128 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );
   ...
}
void mySecondFunction(mystruct * data){

 char * _tmp;
 // This is where i would like something like &data->mmap to replace &_tmp in order to get the right address directly.
 test(data, &_tmp);
 data->mmap = tmp;
 printf("data->mmap %p\n",data->mmap);

}

由于

2 个答案:

答案 0 :(得分:2)

test中,您可以将本地my_char变量设置为mmap的地址。这不会影响_tmp中的main变量。

如果要更改传递给函数的变量,则必须将指针传递给它,如下所示:

void test(mystruct * _input, char ** my_char){
   *my_char = (vhar*)mmap(...);
}

test(data, &data->mmap);

答案 1 :(得分:1)

这是一个完整的解决方法:

void test(mystruct * _input, char ** my_char){
    //Update the reference that was passed
    *my_char = (char*)mmap( 0 , 128 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );

    printf("in function address %p\n", my_char);
}

void mySecondFunction(mystruct * data){
    test(data, &(data->mmap));  // Pass by reference
    printf("data->mmap %p\n",&(data->mmap)); // Prints address of data->mmap
}