C++ 更改作为函数参数传递的指针值

c++ changing a pointers value that's passed as a function parameter

本文关键字:参数传递 指针 函数 C++      更新时间:2023-10-16

我使用一个库,在该库中,我需要向函数发送指向对象的指针。。问题是我需要改变这个指针在函数本身中指向的内容,我真的不知道如何克服这个问题,因为指针是作为值传递的。。

struct.cpp

struct MyStruct {
Node* previous;
...
};

main.cpp

int main(...) {
MyStruct* m = new MyStruct;
m->previous = NULL;
...
while (traversing) {
library_function((AFUNPTR) myFunction, (void*) m->previous);
}

函数.cpp

void myFunction(void* node_from_lib, void* point_to_previous) {
Node* current = (Node*) node_from_lib;
Node* previous = (Node*) point_to_previous;
if (previous != NULL) {
...
}
previous = current;
}

我的问题是,我需要遍历所有节点,但通过这种方式,前面的节点将一直发送到指向NULLmyFunction中。。我尝试过使用Node** previous并分配像*previous = current;这样的"新"上一个,但我仍然遇到seg错误。

我使用的库是Intel PIN,我试图插入指令并将其链接到图中,尽管我已经从示例中删除了所有PIN,因为我认为这是一个通用的c++问题?


这是我用指针指向指针的尝试。。。

struct.cpp

struct MyStruct {
Node** previous;
...
};

main.cpp

int main(...) {
MyStruct* m = new MyStruct;
*(m->previous) = NULL;
...
while (traversing) {
library_function((AFUNPTR) myFunction, (void*) m->previous);
}

函数.cpp

void myFunction(void* node_from_lib, void** point_to_previous) {
Node* current = (Node*) node_from_lib;
Node** previous = (Node**) point_to_previous;
if ((*previous) != NULL) {
(*previous)->memberFunc();
...
}
*previous = current;
}

C:

int main(...) {
MyStruct* m = new MyStruct;
m->previous = NULL;
...
while (traversing) {
library_function((AFUNPTR) myFunction, &m->previous);
}

这里,通过指针传递m->previous(指针的类型为Node**,可以重新解释为void*并返回,而不会丢失任何内容。函数需要void*。)

function.cpp
void myFunction(void* node_from_lib, void* point_to_previous) {
Node* current = (Node*) node_from_lib;
Node* previous = * ((Node**)point_to_previous); // cast for reading - assume point_to_previous is pointer to pointer, and retrieve the pointer
if (previous != NULL) {
...
}
previous = current;
*((Node**)point_to_previous) = previous; // assume, point_to_previous is pointer to pointer, and change the pointer
}

在这里,您可以将void*投射回Node**

在这里,将指针传递给节点指针(Node**)作为第二个参数。它被重新解释为void*,但它只是语义上的。

相关文章: