【问题标题】:Defining a dynamic, read-only array in C在 C 中定义一个动态的只读数组
【发布时间】:2018-05-09 02:50:00
【问题描述】:

如何在 C 中定义一个动态只读整数数组?

我知道我们可以通过使用限定符“const”和“static”来分配静态只读数组。但是在动态数组的情况下如何做呢?

【问题讨论】:

  • 同理:const int *arr = malloc(n * sizeof(*arr));,但这根本没有意义。
  • 这真的没有意义。您需要在某个时候将数据写入数组。但是,您可以定义一个指向数据而不允许修改的变量。
  • 我认为您缺少的一点是您将数组填充为读写数组,然后作为const 传递给任何需要的函数以防止修改(在此处的行之间读取一点)

标签: c dynamic allocation


【解决方案1】:

没有任何标准方法可以将动态分配的内存定义const。没有什么意义,因为除了calloc 之外,您不能对动态分配的内存使用初始化将其初始化为零。 C 根本没有任何标准库函数来将内存初始化为其他任何东西。它要求您改用赋值,而 const 永远无法使用。

您可以将指向动态分配内存的指针声明为const,但如果您这样做,则允许用户(就语言标准而言)抛弃const 并无论如何修改数据。

理论上这可能不够好,但在实践中确实如此。抛弃const 来修改数据的代码,尤其是调用者不清楚的方式,这种情况非常少见。

【讨论】:

  • "允许用户(就语言标准而言)抛弃const",好吧,这样做仍然会引发未定义的行为,不会'是吗?
  • @alk:如果指向 const 限定类型的指针最初来自指向非 const 限定类型的指针,则它不是未定义的。您始终可以将指针转换回其原始类型并使用它。所以你可以从malloc 获取一些东西,对其进行初始化,然后将一个指向 const 限定类型的指针传递给其他例程,但它们可能会合法地将其强制转换回来。
  • @EricPostpischil 编辑希望不再暗示这样的功能不存在。
【解决方案2】:

您可以使用const 限定符指向一个已经创建的非const 数组:

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

int *alloc(int n)
{
    int *arr = malloc(n * sizeof(*arr));

    for (int i = 0; i < n; i++) {
        arr[i] = i;
    }
    return arr;
}

int main(void)
{
    const int *arr = alloc(5);

    arr[3] = 5; /* error */
    return 0;
}

【讨论】:

  • 正如 hvd 正确所说,'arr' 仍然可以通过声明另一个指针来修改,比如 *ptr,它:*ptr = arr;和 *ptr = 64;
  • 当然不是错误而是警告,const不代表C语言中的只读,但是在问问题之前你已经知道了不是?
  • 当然可以!我知道 const 并不意味着只能在 C 中读取。这就是我问这个问题的原因,以便知道是否有其他方法可以做到这一点。在变量的情况下,我们可以一起使用 const static 使变量在 C 中只读。我不知道如何对动态数组做同样的事情。感谢您的帮助!
  • @AbhinayB:“我们可以一起使用 const static 使变量只读”你确定吗?我会说不。 static 也与任何常数(在 C 中)完全无关:
  • @AbhinayB:当然你可以使用staticconst,但是使用static 不会改变任何关于恒定性的东西。如果 GCC 这样做,这是 GCC 的特定行为。它不受 C 标准支持
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 2015-03-13
  • 2018-03-31
  • 2013-02-23
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多