C++ 如何将地址与空指针对齐?

C++ 如何将地址与空指针对齐?,c++,memory,pointers,C++,Memory,Pointers,在应用程序中,我遇到了这样的问题。 该方法旨在为用户提供一个通用接口,以便从全局内存池中获取内存,实现方式如下: shmPool shm; void getMemory(void* mPtr){ mPtr = &shm; } 但很明显,mPtr的价值没有改变。如何将指针的值与未知类型指针对齐。mPtr是一个局部变量。只更改了本地副本-为什么会更改任何其他变量?如果要更改其他指针,则必须获取指向它的引用或指针。mPtr是一个局部变量。只更改了本地副本-为什么会更改任何其他变量?如果

在应用程序中,我遇到了这样的问题。 该方法旨在为用户提供一个通用接口,以便从全局内存池中获取内存,实现方式如下:

shmPool shm;
void getMemory(void* mPtr){
   mPtr = &shm;
}

但很明显,mPtr的价值没有改变。如何将指针的值与未知类型指针对齐。

mPtr是一个局部变量。只更改了本地副本-为什么会更改任何其他变量?如果要更改其他指针,则必须获取指向它的引用或指针。

mPtr是一个局部变量。只更改了本地副本-为什么会更改任何其他变量?如果要更改不同的指针,则必须获取指向它的引用或指针。

为什么不直接返回指针,而不是使用out参数

void* getMemory() {
    return &shm;
}

为什么不直接返回指针,而不是使用out参数呢

void* getMemory() {
    return &shm;
}

这是您的代码,经过修改后,调用者将收到指向shm的指针:

调用方将调用此函数,如下所示:

shmPool* p;
getMemory(&p);
// now p is a valid pointer
你的问题与调整记忆无关。但是,您的代码存在问题,因此请对我的回答持保留态度:

为什么要将对象强制转换为void*?这几乎肯定是糟糕的。 我同意@Björn Pollex的观点,在本例中,最好使用返回值,而不是out参数。
这是您的代码,经过修改后,调用者将收到指向shm的指针:

调用方将调用此函数,如下所示:

shmPool* p;
getMemory(&p);
// now p is a valid pointer
你的问题与调整记忆无关。但是,您的代码存在问题,因此请对我的回答持保留态度:

为什么要将对象强制转换为void*?这几乎肯定是糟糕的。 我同意@Björn Pollex的观点,在本例中,最好使用返回值,而不是out参数。

mPtr指针是按值传递的,其值在函数调用之外不会更改。另外,有一个get函数实际上不返回任何东西,这不是有点奇怪吗?您似乎有两个问题:1如何更改mPtr,2如何将内存与指定的边界对齐。您对哪一个有问题?1您不需要对齐void指针,它将获得shm地址的对齐。2您的函数不返回任何内容-您应该传入指向指针的指针,或者返回指针。mPtr指针是通过值传递的,其值在函数调用之外不会更改。另外,有一个get函数实际上不返回任何东西,这不是有点奇怪吗?您似乎有两个问题:1如何更改mPtr,2如何将内存与指定的边界对齐。您对哪一个有问题?1您不需要对齐void指针,它将获得shm地址的对齐。2您的函数不返回任何内容-您应该传入指向指针的指针,或者返回指针。因为我希望返回值表示内存分配是否成功,例如0表示成功,1表示系统资源不可用。在这种情况下,您可以返回空指针以指示失败。或者你可以抛出一个例外。我已经考虑了抛出异常的方法,我只想学习另一种方式,我对此很好奇。我已经通过使用void**和reinterpret_cast解决了这个问题,它对我来说效果很好,仍然有很多感谢,因为我希望返回值表示内存分配是否成功,就像0表示成功,1表示系统资源不可用在这种情况下,您可以返回一个空指针来指示失败。或者你可以抛出一个例外。我已经考虑了抛出异常的方法,我只想学习另一种方式,我对此很好奇。我已经通过使用void**和reinterpret_cast解决了这个问题,它对我很有效,仍然非常感谢1。我的工作就像一个内存管理系统,它将指针传递给方法,然后将共享内存分配给指针。2.返回一个void*肯定会起作用,我只是好奇是否还有其他方法。void**和exploration\u cast效果很好,非常感谢1。我的工作就像一个内存管理系统,它将指针传递给方法,然后将共享内存分配给指针。2.返回一个void*肯定会起作用,我只是好奇是否还有其他方法。void**和exploration_cast效果很好,很多人感谢我是用void**做的,参考有点危险。thanks@Cyber_Rush:引用比指针危险得多。你能告诉我更多吗?我不太明白这其中的基本部分。THXI是用void**做的,参考有点危险。thanks@Cyber_Rush:引用比指针危险得多。你能告诉我更多吗?我不太明白这其中的基本部分。谢谢