我对C.中的动态const
变量感到好奇
所以,当我在测试时,给它赋值是有问题的,而动态分配const
变量则没有问题。
是的,我知道我们可以使用静态const
变量,但如果我们想使用大的const struct
,它将更有效地节省内存。
这是我测试过的一个程序。。
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int *a = (int*) malloc(sizeof(int));
*a = 77;
printf("value of a %d", a);
return 0;
}
我得到的错误。。
main.c:15:8: error: assignment of read-only location ‘*a’
15 | *a = 15;
| ^
那么有什么办法可以做到吗?
const
的目的主要是帮助程序员避免无意中修改对象。当用const int *a
声明a
时,则*a
的类型为const int
。特别是,它是const
合格的,这意味着它不能根据C 2018 6.3.2.1 1:进行修改
…可修改的左值是一个没有数组类型、没有不完整类型、没有常量限定类型的左值,…
使用*a
作为赋值的左操作数违反了C 2018 6.5.16 2:
赋值运算符的左操作数应为可修改的左值。
本质上,用const int *a
声明a
表示您不希望修改*a
。
如果您想动态分配内存,给它分配一个初始值,然后将其用作const
类型,可以使用两个指针:
int *p = malloc(sizeof *p);
if (!p)
{
fprintf(stderr, "Error, unable to allocate memory.n");
exit(EXIT_FAILURE);
}
*p = 77;
const int *a = p;
那么*p
是一个可修改的左值,可以用来更改内存,而*a
是一个不可修改的左值,可以用const
限定符传递给另一个例程,以避免无意中更改内存。(这不是绝对的保证;C标准允许代码将const int *
转换为int *
,并使用它来修改内存,只要它不指向最初用const
定义的对象即可。(
您可以通过减少p
:的范围来进一步减少意外修改内存的机会
const int *a;
{
int *p = malloc(sizeof *p);
if (!p)
{
fprintf(stderr, "Error, unable to allocate memory.n");
exit(EXIT_FAILURE);
}
*p = 77;
a = p;
}
// p is not in scope here, but a is.
printf("*a = %d.n", *a);
但是,当您将地址传递给free
时,需要使用强制转换来删除const
,如free((void *) a);
中所示。
您可以在分配const对象时初始化它。示例:
auto ptr = std::make_unique<const int>(77);