如何解决有建议的方法来用C返回地址吗?
我必须从函数中获取地址。我正在使用32位系统,并且该代码不必是可移植的,但是,我认为这样做有好处。
在所有选项中,我认为这三个选项对读者来说最有意义。
- 像uint32一样将其作为本机size_t传递。这里几乎没有错误的余地。所以我认为这很安全,对吗?当您要使用它时,需要明确说明如何重新铸造它。
uint32_t address = 0;
example_structure_t *str;
find_address(&address);
str = (example_structure_t*) address;
- 这似乎就是空指针的用途。但是,我被“空指针坏了”的头脑打倒的次数并不为空。这是不安全的吗?像这样返回,我无法通过暗示ADDRESS是否为空来返回除成功/失败以外的错误。
void *address;
example_structure_t *str;
address = find_address();
str = address;
- 似乎是双指针的好地方。我有一个在我下面工作并且正在学习C的家伙,所以我现在还没有试图使他感到困惑。
example_structure_t **str;
find_address(str);
我知道如何做到这一点有很多意见。但是就安全性或最佳实践而言,有什么事实吗?
解决方法
像uint32一样将其作为本机size_t传递。房间很小 对于这里的错误。所以我认为这很安全,对吗?你需要 明确表示要重新使用它。
否,即使在32位系统上,size_t
和uint32_t
都不适合于此目的。地址的大小不必等于或小于机器字的大小-如果确实确实是uint32_t
在给定实现中表示的含义-并且不能保证它会适合在size_t
中。如果要以整数形式传递地址,则应使用intptr_t
或uintptr_t
(来自stdint.h
)。如果您的实现未定义这些可选类型,则可能没有适合该目的的整数类型。
但是,如果您要传达一个指针,那么提出除了作为指针之外传达它的建议很奇怪。
这似乎就是空指针的用途。但是数量 我被“空指针坏”砸在头上的时候不是 空值。这是不安全的吗?这样回来,我迷路了 通过暗示是否能够返回成功/失败以外的错误的能力 ADDRESS是否为空。
如果没有更合适的指针类型,则void
指针就是的指针。。另一方面,如果您将始终返回指向特定数据类型的指针,则该指针类型应反映出来。尽管返回了目标类型的指针,但本质上并没有不安全的地方。
如果您需要提供比成功/失败更详细的状态信息,则除了函数的返回值外,还应该使用out参数。然后由您选择是通过该参数传达指针还是状态代码。
我不知道有什么误导的编程哲学或编码约定会教人在C中使用void *
类型是无条件的错误。肯定在某些情况下,这是正确的做法,而且并非如此罕见。
似乎是双指针的好地方。我有一个工作的人 在我下面,只是在学习C,所以我没有试图混淆他
那将是已经讨论过的out参数选项。并没有什么特别的问题,但是,如果您可以通过使用返回值而没有out参数的话,那我自己就是这样。
我知道如何做到这一点有很多意见。但是就安全性或最佳实践而言,有什么事实吗?
我认为关于如何如何做到的观点不多。我不愿意相信许多人会不同意,如果您特别想传达一个指针,那么最好将它作为一个指针,或者您应该更具体的指针类型胜过{{ 1}}中有一个达到目的。除此之外,我想说的是,细节取决于项目约定,针对特定情况的要求和个人喜好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。