gpt4 book ai didi

c - 类型限定符对存储位置的影响

转载 作者:行者123 更新时间:2023-11-30 17:56:57 24 4
gpt4 key购买 nike

正如标题中提到的,如果类型限定符影响存储位置(stackbss等),我有点困惑。 ) 的声明符。为了描述更多信息,我正在考虑以下声明。

int main()
{
const int value=5;
const char *str= "Constant String";
}
  • 在上面的代码中,默认的storage-class-specifierauto
  • 因此,假设这些常量在创建时将分配在 mainstack-frame中。
  • 通常,指向堆栈中各个内存位置的指针可以自由修改其中包含的值。
  • 因此,从上述几点可以理解,类型限定符添加了一些逻辑来保留所存储元素的常量性质(如果是的话,它是什么? ?)或常量存储在内存的只读部分中。请详细说明

更详细的示例

#include <stdio.h>
int main(void)
{
int val=5;
int *ptr=&val;
const int *cptr=ptr;

*ptr=10; //Allowed
//*cptr=10; Not allowed

//Both ptr and cptr are pointing to same locations. But why the following error?
//"assignment of read-only location ‘*cptr’"

printf("ptr: %08X\n",ptr);
printf("cptr: %08X\n",cptr);
printf("Value: %d\n",*ptr);
}

在上面的示例中,cptrptr 都指向同一位置。但是 cptr 是指向 const 类型限定的整数的指针。修改cptr的值时,编译器会抛出错误“分配只读位置‘*cptr’”。但我可以使用 ptr 修改相同位置,如下面的输出所示。请解释

ptr: BFF912D8
cptr: BFF912D8
Value: 10

最佳答案

在第一个示例中:

int main()
{
const int value=5;
const char *str= "Constant String";
}

变量和字符串文字的存储位置留给实现。 C 标准所保证的只是这些将存储在只读存储器中,该存储器可以在文本段、堆栈或任何地方。

在第二种情况下:

 int *ptr=&val;
const int *cptr=ptr;

当您尝试修改*cptr时,编译器并不关心cptr指向的实际位置是只读还是可写。它所关心的是类型限定符 const,使用它认为 cptr 指向的位置是只读的。

另一种变体:

    const int i = 5;
p = &i;
*p = 99;

在这种情况下,编译器允许通过指针修改 const 值。但这是未定义的行为

关于c - 类型限定符对存储位置的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13098536/

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