为什么我不能访问指向堆栈数组的指针?

安德烈亚斯(Andreas):

请看下面的代码。它尝试将数组作为a char**传递给函数:

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

static void printchar(char **x)
{
    printf("Test: %c\n", (*x)[0]);
}

int main(int argc, char *argv[])
{
    char test[256];
    char *test2 = malloc(256);

    test[0] = 'B';
    test2[0] = 'A';

    printchar(&test2);            // works
    printchar((char **) &test);   // crashes because *x in printchar() has an invalid pointer

    free(test2);

    return 0;
}

我只能通过显式强制转换&test2char**已经编译的事实暗示此代码是错误的。

不过,我想知道这到底有什么问题。我可以将指针传递给动态分配的数组的指针,但不能将指针传递给堆栈上的数组的指针。当然,我可以通过首先将数组分配给一个临时变量来轻松解决该问题,如下所示:

char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);

仍然,有人可以向我解释为什么直接强制char[256]转换不起作用char**吗?

emlai:

因为test不是指针。

&test获取指向类型char (*)[256]不兼容char**的数组的指针(因为数组不是指针)。这导致未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能访问数组中指向我的成员函数的指针?

为什么我们不能比较不指向同一数组中元素的指针?

当我可以创建共享指针时,为什么不能创建指向数组的唯一指针?

为什么我不能将指向固定大小数组的指针的地址传递给需要指向 C 中指针的指针的函数?

为什么当我访问由三个整数组成的对象时,它从基本指针中减去而不是从堆栈指针中减去?

当delete []指针起作用时,为什么不能获得所指向的数组的大小?

为什么我不能使用flag.StringVar传递指向fmt.Println的指针?

为什么我不能引用指向实例化对象函数的指针?

为什么我不能将此json访问php数组?

为什么我不能访问类数组索引

为什么%d指向数组的指针给我数组的第一个元素?

为什么我们使用指向一维数组或多维数组的指针

为什么在尝试将指向数组的指针作为函数的参数时出现访问冲突错误?

为什么返回指向本地定义变量的指针为null而不是指向堆栈中位置的指针?

为什么我们访问由 char* 指向的字节的值而不是指针的值?

为什么我不能拥有指向与成员变量具有相同指针类型的对象的指针?

为什么数组可以在递归堆栈深处访问,而 int 类型不能?

为什么不能插入指向多集的const指针?

为什么在将指针传递给函数后访问指向多维数组的指针会返回分段错误?

为什么我不能显示指针的地址?

为什么不能在没有强制转换的情况下指向指针,访问结构成员?

C-为什么指向指针的指针与指向数组的指针不一样?

为什么在rust中访问指向结构的指针上的字段?

为什么我不能分配一个函数指针变量来指向一个特定的函数。错误如下

为什么我获得空指针访问?

为什么我们不能直接将arr分配给数组指针

由于数组会衰减到指针,为什么我不能应用const?

为什么我不能在函数中的数组指针上使用 realloc ?

为什么我不能使用指针初始化数组?