gpt4 book ai didi

c - 在 C 中取消引用本地数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:19 24 4
gpt4 key购买 nike

根据我对 C 的理解,您可以将指针变量和数组变量视为等价的,因为它们最终都是指针(一个指向本地函数堆栈,另一个指向内存中的任意随机点)。

当我需要返回一个指针时,我通常将一个指针传递给一个指针(例如 char ** pvar),所以我可以看到将它传回一个取消引用的本地是多么没有意义数组,因为您无法更改变量的位置。

我的期望是,如果我尝试这样做,编译器会让我这样做,然后在我尝试设置返回指针值时发生段错误或崩溃。

但是,当尝试取消引用数组类型 (&array) 时,编译器会生成一个关于使用不兼容类型的警告,然后它将指针传递给数组,从接收函数的角度来看,本质上失去了一个间接级别。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void ptrptr(uint32_t** dptr)
{
printf("%x, %x\n", dptr, *dptr);
}

void oneptr(uint32_t* ptr)
{
printf("%08x, %x\t", ptr, *ptr);
ptrptr(&ptr);
}

int main()
{
uint32_t array[] = {1};
uint32_t *ptr = calloc(1, sizeof( uint32_t));
ptr[0] = 3;
oneptr(ptr); /* OK, passes an (uint32_t *) */
oneptr(array); /* OK, passes an (uint32_t *) */
ptrptr(&ptr); /* OK, passes an (uint32_t **) */
ptrptr(&array); /* ??, passes an (uint32_t *) */
return 0;
}

编译它给我警告

cc     test.c   -o test
test.c: In function ‘main’:
test.c:24:9: warning: passing argument 1 of ‘ptrptr’ from incompatible pointer type [-Wincompatible-pointer-types]
ptrptr(&array);
^
test.c:5:6: note: expected ‘uint32_t ** {aka unsigned int **}’ but argument is of type ‘uint32_t (*)[1] {aka unsigned int (*)[1]}’
void ptrptr(uint32_t** dptr)
^~~~~~
0061a008, 3 7ebfa144, 61a008
7ebfa154, 1 7ebfa144, 7ebfa154
7ebfa150, 61a008
7ebfa154, 1

当我使用 gcc、clang 和 cl 编译它时,我得到了相同的结果,所以我相当确信这不是编译器错误。接下来的问题是,当我尝试取消引用数组时,为什么 C 会静默传递指针 (uint32_t*) 而不是指向指针 (uint32_t**) 的指针?

最佳答案

The question then is, why is C silently passing a pointer (uint32_t*) instead of a pointer to a pointer (uint32_t**) when I try to dereference an array?

  • 不是。

  • C 正在传递指向一个 uint32_t 数组的指针 (uint32_t(*)[1])。

  • 它是一个指向一个 uint32_t 的数组的指针,因为它是一个 uint32_t 的数组,并且您得到了一个指向它的指针。

  • 它并不沉默。你会得到一个编译器警告说“嘿,这是错误的指针类型!”。你以为这是什么?

    test.c: In function ‘main’:
    test.c:24:9: warning: passing argument 1 of ‘ptrptr’ from incompatible pointer type [-Wincompatible-pointer-types]
    ptrptr(&array);
    ^
    test.c:5:6: note: expected ‘uint32_t ** {aka unsigned int **}’ but argument is of type ‘uint32_t (*)[1] {aka unsigned int (*)[1]}’
    void ptrptr(uint32_t** dptr)
  • 您没有取消引用数组。您正在创建一个指向数组的指针,将其转换为错误的指针类型,然后取消引用它。

  • 你给出数字 1 的原因是因为指向数组的指针实际上指向与指向数组中第一个事物的指针相同的地址。虽然,它是一种不同类型的指针,这意味着 ++ 之类的东西的工作方式不同,但随后您将其转换为相同类型的指针,因此您的代码不会注意到。

关于c - 在 C 中取消引用本地数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52509651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com