如何在C中为动态常量变量赋值

  • 本文关键字:动态 常量 变量 赋值 c
  • 更新时间 :
  • 英文 :


我对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);

最新更新