有推荐的方法 return C 中的地址吗?

Is there recommended way to return an address in C?

我必须从一个函数中取回一个地址。我使用的是 32 位系统,此代码不需要可移植,但是,我认为这是一个好处。

在所有选项中,我认为这三个对 reader 最有意义。

  1. 像 uint32 一样将其作为本机 size_t 传递。这里几乎没有错误的余地。所以我认为这是安全的,对吧?当你想使用它时,你需要明确地重新铸造它。
uint32_t address = 0;
example_structure_t *str;

find_address(&address);
str = (example_structure_t*) address;

  1. 这似乎就是 void 指针的用途。但是我被“空指针不好”的头撞的次数不是空的。这在任何方面都不安全吗?像这样返回,通过暗示 ADDRESS 是否为空,我失去了 return 除了 success/failure 之外的错误的能力。
void *address;
example_structure_t *str;

address = find_address();
str = address;
  1. 似乎是双指针的好地方。我有一个在我手下工作的人,他正在学习 C,所以我还没有试图混淆他。
example_structure_t **str;

find_address(str);

我知道对于如何做到这一点有很多意见。但是在安全或最佳实践方面有什么事实吗?

Passing it around as native size_t like a uint32. There is little room for error here. So I THINK this is safe, right? You need to be explicit about re-casting it when you want to use it.

不,size_tuint32_t 都不一定适合这个目的,即使在 32 位系统上也是如此。地址的大小不一定等于或小于机器字的大小——如果这确实是 uint32_t 在给定实现中所表示的——并且不能保证它适合在 size_t 中。如果你想以整数形式传递地址,那么你应该使用 intptr_tuintptr_t(来自 stdint.h)。如果您的实现没有定义这些可选类型,那么可能没有适合该目的的任何整数类型。

话虽如此,但是,如果您要传达一个指针,那么提议传达它而不是 一个指针是很奇怪的。

This does seem to be what void pointers are for. But the number of times I've been bashed in the head with "void pointers are bad" is not null. Is this unsafe in any way? Returning like this, I lose my ability to return errors other than success/failure by implying if ADDRESS is null or not.

如果没有更合适的指针类型,就是void 指针。另一方面,如果您总是 returning 一个指向特定数据类型的指针,那么指针类型应该反映出这一点。尽管有目标类型,returning 指针本身并没有什么不安全的。

如果您需要提供 finer-grained 状态信息而不是成功/失败,那么除了函数的 return 值之外,您还应该使用 out 参数。那么,您可以选择是通过该参数传送指针还是状态代码。

我不知道有什么误导性的编程哲学或编码约定可能会告诉我们在 C 中使用类型 void * 绝对是错误的。在某些情况下,这样做是正确的,而且这种情况并不少见。

Seems like a good spot for a double pointer. I have a guy that works under me and is just learning C, so I wasn't trying to confuse him just yet.

那将是已经讨论过的 out 参数选项。这并没有什么特别的问题,但是如果你可以通过使用 return 值来不使用 out 参数,那么我自己就是这样。

I know there is a ton of opinion on how this can be done. But is there anything factual in terms of safety or best practice?

我认为关于如何可以完成的意见并不多。我不愿意相信很多人会不同意,如果你特别想传达一个指针,那么你最好这样做 as 一个指针,或者你应该更喜欢一个更具体的指针类型在 void * 之上,其中有一个可以达到目的。除此之外,我想说细节是项目约定、situation-specific 要求和个人喜好的问题。