gpt4 book ai didi

指向 const 指针的 const 指针

转载 作者:行者123 更新时间:2023-12-04 18:13:08 25 4
gpt4 key购买 nike

我正在使用一些内存指针。我不想使用散列定义,请把讨论放在一边。我只想知道为什么这不能编译:

#include <stdio.h>

static const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul;
static const unsigned long *const pMemAddrB = pMemAddrA;

int main (void)
{
printf("%x", (unsigned int) pMemAddrB);
return 0;
}

编译器输出 gcc:
||=== TestConst, Debug ===|
...main.c|4|error: initializer element is not constant|
||=== Build finished: 1 errors, 0 warnings ===|

编辑:

阅读答案后,我很高兴知道如何解决这个问题。

但是我不明白为什么这是一个问题。据我所知,静态内存是在程序启动时分配的。我知道如果变量“活”在不同的文件中,并且编译器不能保证变量的分配顺序,就会出现问题。但是,如果两个变量都“存在”在同一个文件中 - 就像两个变量都存在于同一个函数中一样 - 我认为编译器可以确保按照文件中声明的变量的顺序分配内存,因此我不会不明白为什么声明和初始化指向另一个 const 指针的 const 指针是一个问题。如果有人能启发我,我会很高兴。

最佳答案

您的指针具有文件范围,因此初始化程序必须是常量表达式。 pMemAddrA不是常量表达式,因此不能用于使用静态存储初始化变量。

它可用于初始化 block 范围内的变量,因此如果您将声明移动到 main (并且至少使第二个非静态),它将编译:

#include <stdio.h>

int main (void)
{

const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul;
const unsigned long *const pMemAddrB = pMemAddrA;

printf("%x", (unsigned int) pMemAddrB);
return 0;
}

如果必须在文件范围内声明这两个指针,则无法防止重复初始化表达式,
static const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul;
static const unsigned long *const pMemAddrB = (unsigned long *) 0x00000200ul;

#define ing它。

关于指向 const 指针的 const 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com