【问题标题】:C array of pointerC 指针数组
【发布时间】:2018-01-23 16:35:39
【问题描述】:

为了说明,可以声明像int* x[][4]这样的C中的二维指针数组,其中第一个索引可以在运行时固定它是动态的,那么我可以说动态一维数组的动态声明可以在以某种方式通过将第二个索引替换为值 1 像 int*[][1] 和二维数组动态二维数组 int*[][][1] calloc() malloc() 在内部使用它们是我的逻辑完全正确,这应用在C语言程序中函数内部动态数组声明的简化案例

【问题讨论】:

  • 您有问题吗?
  • 是的 - “我为什么要让我的帖子可读?”
  • ...可以在 C 中声明像int* x[][4] 这样的二维指针数组。您正在使用哪些 C 编译器和选项不会将此标记为错误(缺少数组大小)?还是您指的是函数的参数?
  • int *[][1] 仍然是一个二维数组。一维版本是int *[]
  • int *[][][1] 是非法的。只有第一个维度可以是动态的。

标签: c arrays dynamic


【解决方案1】:

为了说明,C中的二维指针数组,如int* x[][4] 可以声明

仅在两种情况下:

  1. x 的初始值设定项隐式传递第一个维度的值时,

    int* x[][4] = { {NULL, NULL, NULL, NULL}, {NULL, NULL, NULL, NULL} };
    
  2. 作为函数参数的类型。在这种情况下,它完全等同于将参数声明为具有int *(*)[4] 类型:指向int 的四个指针的数组的指针。 如果实际给出了第一个维度,情况也是如此。

    void foo(int* x[][4]);
    

,第一个索引可以在运行时固定

在上面的情况(1)中,不是,第一个维度是在编译时确定的。

在上面的情况(2)中,不完全是。然后是指向一维数组的指针的声明。这样的指针可以指向int * 的二维数组的第一个元素,并且它可以被索引,就好像它实际上指定了这样的二维数组一样。第一个维度的大小不是传达的,但如果指针实际上指向一个对象,那么对于函数的目的,该维度是固定的,无论指向的对象是否是否动态分配。

它是 那么我可以说动态的动态声明吗 一维数组可以通过替换 值 1 的第二个索引,例如 int*[][1]

这种变化会产生一个静态不同的类型(在那些它完全有效的上下文中)。在情况 (2) 而不是情况 (1) 中,这种类型和我们之前讨论的类型都可以指向动态分配的对象,但它们也可以指向适当类型的自动或静态持续时间对象。那里没有任何内在的动态。

对于二维数组 动态二维数组 by int*[][][1]

没有。甚至对于函数参数的类型也不行。最多可以省略(一个)前导维度。

是否 calloc() malloc() 内部使用它们

一点也不。他们怎么可能?分配函数根本看不到这种数据类型。您只告诉他们要分配多少空间,或者作为单个复合值 (malloc) 或作为(元素计数,元素大小)对 (calloc)。因此调用者需要知道需要多少内存。无论如何,这仅适用于情况(2)。情况 (1) 本质上会产生静态或自动分配,而不是动态的。

我的逻辑完全正确

没有。

这适用于 是在一个简单的动态数组声明的情况下使用 C语言程序中的函数

既不作为函数的局部变量(情况 1)也不作为函数参数(情况 2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多