将 int ** 分配给 int 指针

Posted

技术标签:

【中文标题】将 int ** 分配给 int 指针【英文标题】:Assigning int ** to an int pointer 【发布时间】:2020-04-15 14:47:06 【问题描述】:

对不起,这个奇怪的问题。我编写了以下程序:

#include <stdio.h>

int main()
    
    int a[2];
    int **vararr = (int **)a;

    int testarr[]= 1, 2 ,3;
    printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
    vararr[0] = (int *)testarr;
    printf("%d %d %d\n", testarr[0], testarr[1], testarr[2]);
    printf("%d %d %d\n", vararr[0][0], vararr[0][1], vararr[0][2]);

返回:

1 2 3
32765 2 3
32765 2 3

我期待:vararr[0][0] == 1 &amp;&amp; testarr[0] == 1

如果我重新运行程序,32765 将更改 +-2

我真的不明白我做错了什么。我找不到任何关于我的问题的信息,因为我真的不知道如何正确地制定它。

【问题讨论】:

您将int * 直接投射到int **。你期待在这里做什么?您似乎正试图将 int * 存储在 int 中。 你能解释一下int **vararr = (int **)a;背后的理由吗?为什么? 如何正确分配**vararr?我想要一个 int 指针数组 您能描述一下您要完成的工作吗?通常这种指针hijinks 被认为是“code smell”,因为它难以编写、难以阅读且难以正确处理。通常有更好的方法来编写代码。 您应该尽可能避免指针转换。如果您实际上取消引用一个指针,它应该具有它指向的对象的正确类型。在这种情况下,您将指针值写入整数数组。如果sizeof(int *) 大于sizeof(int),你认为会发生什么?未定义的行为。你会破坏你的运行时环境。不要这样做。 【参考方案1】:

int **vararr = (int **)a; 是无效转换,因为类型不兼容。

指向指针的指针:

不是数组 不是二维数组 不能指向数组 不能指向二维数组 可用于指向指针数组的第一个元素

这意味着除非你有一个int* array[n] 在某个地方,否则使用int** 是没有意义的。

int** 替换为int*,一切正常。

【讨论】:

may be used to point at the first element of an array of pointers 更一般地说,它可用于指向任何指针(适当类型),无论它是数组的第一个元素、第二个元素还是不在数组中全部。【参考方案2】:

您将指向整数的指针(从数组中衰减)重新解释为指向整数的指针。指向的类型(int 和指向 int 的指针)不是指针可互转换的,因此当您尝试通过重新解释的指针间接访问指向的对象时,程序的行为是未定义的。

我想要一个 int 指针数组

您可以像这样声明一个 int 指针数组:

int* ptr_arr[] testarr;

这是一个包含一个元素的数组。该元素是一个指向 int 的指针。它指向testarr的第一个元素。

【讨论】:

非常感谢,这正是我想要的。如果我想使用 int **ptr_arr,正确的方法是什么? @Celz T[] 可隐式转换为 T*,因此 int*[] 可隐式转换为 int**。您可以在任何需要int** 的地方使用ptr_arr @FrançoisAndrieux 我想问,如何初始化数组,使用int ** ptr_arr @Celz 你想用int**初始化什么样的数组? @Celz 请在问题部分查看我的最后一条评论。不清楚你在问什么。

以上是关于将 int ** 分配给 int 指针的主要内容,如果未能解决你的问题,请参考以下文章

将 Int 指针分配给 double 变量

将 const int 分配给指向 int 的 const 指针是非法的吗?

将短路分配给 int * 失败

指针问题:从不兼容的类型“int”分配给“int *”

将 *array 分配给指针

从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;