在C中定义动态只读数组

在C中定义动态只读数组,c,dynamic,allocation,C,Dynamic,Allocation,如何在C中定义动态只读整数数组 我知道我们可以通过使用限定符“const”和“static”来分配静态只读数组。但是,在动态数组的情况下,如何执行相同的操作呢 没有任何标准方法将动态分配的内存定义为const。这并没有多大意义,因为除了calloc之外,您不能对动态分配的内存使用初始化将其初始化为零。C没有任何标准的库函数来初始化内存。它要求您改为使用赋值,而赋值永远不适用于const 您可以将指向动态分配内存的指针声明为const,但如果您这样做,则允许用户(就语言标准而言)丢弃const,并

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


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

没有任何标准方法将动态分配的内存定义为
const
。这并没有多大意义,因为除了
calloc
之外,您不能对动态分配的内存使用初始化将其初始化为零。C没有任何标准的库函数来初始化内存。它要求您改为使用赋值,而赋值永远不适用于
const

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


从理论上讲,这可能不够好,但在实践中确实如此。丢弃const以修改数据的代码(尤其是以调用方不清楚的方式)非常少见。

您可以使用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;
}
#包括
#包括
int*alloc(int n)
{
int*arr=malloc(n*sizeof(*arr));
对于(int i=0;i
相同:
const int*arr=malloc(n*sizeof(*arr)),但这根本没有意义。它真的没有意义。您需要在某个时刻将数据写入数组。但是,您可以定义一个指向数据的变量,而不允许修改。我认为您缺少的一点是将数组作为读写数组填充,然后作为
const
传递给任何所需的函数,以防止修改(此处读取行之间的位),正如hvd所说的那样,“arr”仍然可以通过声明另一个指针(例如*ptr)来修改:*ptr=arr;和*ptr=64;当然,这不是一个错误,而是一个警告,
const
并不意味着在C语言中是只读的,但是你在问问题之前就已经知道了,不是吗?是的,当然!我知道const并不意味着C中的只读。这就是我问这个问题的原因,以便知道是否有其他方法可以做到这一点。在变量的情况下,我们可以一起使用const static使变量在C中只读。我不知道如何对动态数组执行相同的操作。谢谢你的帮助@AbhinayB:“我们可以一起使用const static使变量为只读”您确定吗?我想说不。另外,
static
与任何恒常性(在C中)完全无关:@AbhinayB:当然你可以将
static
const
一起使用,但是使用
static
不会改变任何关于恒常性的东西。如果GCC这样做,这是GCC的特定行为。它不受C标准的支持。“允许用户(就语言标准而言)抛弃
const
”,这样做仍然会调用未定义的行为,不是吗?@alk:如果指向const限定类型的指针最初来自指向非const限定类型的指针,那么它不是未定义的。始终允许您将指针转换回其原始类型并使用它。因此,您可以从
malloc
中获取某些内容,对其进行初始化,然后将指向常量限定类型的指针传递给其他例程,但它们可能会合法地将其回滚。@EricPostSchil编辑为希望不再暗示这样的函数不存在。