Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有推荐的方法返回C语言中的地址?_C_Pointers_Memory Address_Void Pointers - Fatal编程技术网

是否有推荐的方法返回C语言中的地址?

是否有推荐的方法返回C语言中的地址?,c,pointers,memory-address,void-pointers,C,Pointers,Memory Address,Void Pointers,我必须从一个函数得到一个地址。我使用的是32位系统,这个代码不需要是便携式的,但是,我认为这是一个好处。 在所有选项中,我认为这三个选项对读者来说最有意义 将其作为本机大小传递\u不像uint32。这里几乎没有出错的余地。所以我认为这是安全的,对吗?当您想要使用它时,您需要明确地重新铸造它 这似乎就是虚空指针的用途。但我被“void pointers is bad”击中头部的次数并不是零。这有什么不安全的地方吗?这样返回时,我无法通过暗示地址是否为空来返回除成功/失败以外的错误 似乎是双指针的好

我必须从一个函数得到一个地址。我使用的是32位系统,这个代码不需要是便携式的,但是,我认为这是一个好处。 在所有选项中,我认为这三个选项对读者来说最有意义

  • 将其作为本机大小传递\u不像uint32。这里几乎没有出错的余地。所以我认为这是安全的,对吗?当您想要使用它时,您需要明确地重新铸造它
  • 这似乎就是虚空指针的用途。但我被“void pointers is bad”击中头部的次数并不是零。这有什么不安全的地方吗?这样返回时,我无法通过暗示地址是否为空来返回除成功/失败以外的错误
  • 似乎是双指针的好位置。我有一个在我手下工作的家伙,他正在学习C语言,所以我还没想把他弄糊涂
  • 我知道人们对如何做到这一点有很多意见。但是,在安全性或最佳实践方面是否有任何事实

    将其作为本机大小传递\u不像uint32。空间不大 这里的错误。所以我认为这是安全的,对吗?你需要 当您想要使用它时,请明确说明如何重新铸造它

    不,即使在32位系统上,
    size\u t
    uint32\u t
    都不一定适合此目的。地址的大小不一定等于或小于机器字的大小——如果这确实是
    uint32\u t
    在给定实现中所表示的话——并且也不能保证它将适合
    size\u t
    。如果要以整数形式传递地址,则应使用
    intptr\t
    uintpr\t
    (从
    stdint.h
    )。如果您的实现没有定义这些可选类型,那么可能没有适合此目的的整数类型

    尽管如此,如果你试图传达一个指针,那么除了作为指针之外,建议传达它是很奇怪的

    这似乎就是虚空指针的用途。但是 有几次我被“虚空指针是坏的”打到了头上,这可不是什么好事 无效的这有什么不安全的地方吗?像这样回来,我失去了我的生命 通过暗示 地址是否为空

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

    如果需要提供比成功/失败更细粒度的状态信息,那么除了函数的返回值之外,还应该使用out参数。那么,您可以选择是通过该参数传递指针还是状态代码

    我不知道错误的编程哲学或编码惯例会告诉我们在C中使用类型
    void*
    是无条件的糟糕。当然,在某些情况下,这样做是正确的,而且并不罕见

    似乎是双指针的好位置。我有一个工作的人 在我的指导下,他正在学习C语言,所以我并没有想把他弄糊涂 还没有

    这将是已经讨论过的out参数选项。这并没有什么特别的问题,但是如果您可以通过使用返回值而不使用out参数,那么我自己也会这样做

    我知道人们对如何做到这一点有很多意见。但是,在安全性或最佳实践方面是否有任何事实


    我认为对于如何做到这一点没有太多不同的意见。我不愿意相信很多人会不同意,如果你特别想传达一个指针,那么你最好作为一个指针来传达,或者你应该更喜欢一个更具体的指针类型,而不是
    void*
    ,因为有一个指针可以达到这个目的。除此之外,我想说的是,细节是项目惯例、具体情况要求和个人偏好的问题。

    为什么不干脆
    example\u structure\u t*str=find\u address()?如果指针指向单个类型,则只需使用正确的指针类型。如果它可能指向几种不同的数据类型中的任何一种,则使用
    void*
    。如果它可能是数据指针或函数指针,那么严格来说,
    void*
    不能保证工作(函数指针不必表示为
    void*
    )。“void指针是坏的”,因为它们是非类型化地址。如果你需要你的程序返回一个非类型化的地址(可能是个坏主意,但你似乎知道你在做什么),那么你应该使用一个空指针。告诉我malloc返回的是什么类型?严格地说,在选项2中,你不会失去错误值的选项。Linux内核在多种情况下都会这样做。您可能会得到一个实际包含
    -enoint
    或类似内容的指针。但是在搜索了很多天,直到找到了一些与
    IS_ERR
    有关的缺失检查,以避免访问这样一个无效地址和创建这些无效指针的竞争条件之后,我坚信,对于使用这些机制的人来说,一定有一个专门的地狱。(这提醒我,我仍然需要深入研究LKML habbits,并提供一个bug修复程序)这一切都是有意义的,我将投票作为答案。我忘了Uintptru\t。是的,这个想法是用指针的整数值。问题的一部分是我真的想保留错误作为返回。所以err=findAddress(someAddressArg);如果不使用双指针,我不确定是否有一种真正干净的方法可以在不创建本地uintptr并将地址作为指针本身传递的情况下完成这项工作。除非我遗漏了什么?对吗?在某些情况下,它需要在本地内存中
    uint32_t address = 0;
    example_structure_t *str;
    
    find_address(&address);
    str = (example_structure_t*) address;
    
    
    void *address;
    example_structure_t *str;
    
    address = find_address();
    str = address;
    
    example_structure_t **str;
    
    find_address(str);