在C语言中如何定义一个动态只读整数数组?
我知道我们可以使用修饰符“const”和“static”来分配静态只读数组。但是如何在动态数组的情况下做到相同呢?
在C语言中如何定义一个动态只读整数数组?
我知道我们可以使用修饰符“const”和“static”来分配静态只读数组。但是如何在动态数组的情况下做到相同呢?
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;
}
const
在C语言中并不意味着“只读”,但在你提问之前你已经知道了,对吧? - David Ranieristatic
与任何常数无关。 - alkconst
后面加上static
,但是使用static
并不会改变常量的性质。如果GCC这样做,那么这是GCC特有的行为。它不受C标准支持。 - alkconst
。这样做没有太多意义,因为除了使用calloc
将其初始化为零之外,您无法对动态分配的内存使用初始化。C语言根本没有用于将内存初始化为其他任何内容的标准库函数。它要求您使用赋值来代替,但这永远无法与const
一起使用。const
,但如果这样做,用户可以(就语言标准而言)强制转换掉const
并修改数据。const
以修改数据,特别是以对调用方不清楚的方式进行修改的情况非常罕见。const
”,但这样做仍然会引发未定义的行为,不是吗? - alkmalloc
获取一些内容,对其进行初始化,然后将指向const限定类型的指针传递给其他例程,但是它们可能会合法地将其强制转换回来。 - Eric Postpischil
const int *arr = malloc(n * sizeof(*arr));
,但这根本没有意义。 - David Ranieri