相关疑难解决方法(0)

C/C++改变了const的值

我有一篇文章,但我失去了它.它展示并描述了一些人们应该小心的C/C++技巧.其中一个让我感兴趣,但现在我正在尝试复制它,我无法将其编译.

这个概念是可以随意改变constC/C++ 中a的值

它是这样的:

const int a = 3;          // I promise I won't change a
const int *ptr_to_a = &a; // I still promise I won't change a
int *ptr;
ptr = ptr_to_a;

(*ptr) = 5;               // I'm a liar; a is now 5
Run Code Online (Sandbox Code Playgroud)

我想向朋友展示这个,但现在我错过了一步.有谁知道它开始编译和工作缺少什么?

ATM我从'const int*'到'int*'的转换无效,但是当我读到我试过的文章时,它运行得很好.

c++ const

19
推荐指数
4
解决办法
6万
查看次数

在C++中更改const变量的值

我试图更改一个变量的值,该变量定义为int const,如下所示.

const int w = 10;
int* wp = const_cast <int*> (&w);
*wp = 20;
Run Code Online (Sandbox Code Playgroud)

w的值没有改变,即使在赋值之后仍然是10,尽管它表明w和wp都指向同一个内存位置.但是我可以更改w的值,如果在声明时定义如下

int i = 10;
const int w = i;
Run Code Online (Sandbox Code Playgroud)

如果我改变i的声明使其成为常量

const int i = 10;
Run Code Online (Sandbox Code Playgroud)

w的值不会改变.

在第一种情况下,为什么w的值没有改变,即使w和wp指向相同的内存位置[这是我打印地址时的印象]

与编译器有什么不同,它以不同的方式处理这两种情况?

有没有办法确保w不会失去常数,无论它的定义方式如何?

c++ const

16
推荐指数
3
解决办法
2万
查看次数

相同内存地址的两个不同值

#include <iostream>
using namespace std;

int main() {
    const int N = 22;
    int * pN = const_cast<int*>(&N);
    *pN = 33;
    cout << N << '\t' << &N << endl;
    cout << *pN << '\t' << pN << endl;
}
Run Code Online (Sandbox Code Playgroud)

产量

22 0x22ff74

33 0x22ff74

为什么同一地址有两个不同的值?

c++

16
推荐指数
3
解决办法
1740
查看次数

为什么`const int&k = i; ++ i; `可能吗?

我应该确定此函数在语法上是否正确:

int f3(int i, int j) { const int& k=i; ++i; return k; }

我已经对其进行了测试,并且可以使用我的主要功能进行编译。

我不明白为什么会这样。

通过调用函数,可以肯定地f3创建变量的副本,ij在新的存储空间中进行设置const int& k=i,然后将新创建k的存储空间设置为与复制的存储空间完全相同的空间i,因此可以进行任何更改,即增量鉴于已设置,++i将导致++k无法执行const

任何帮助是极大的赞赏

c++ syntax const reference

13
推荐指数
1
解决办法
537
查看次数

C - 通过const声明访问非const

是否const通过constC标准允许的声明访问非对象?例如,以下代码保证在符合标准的平台上编译和输出23和42?

翻译单位A:

int a = 23;
void foo(void) { a = 42; }    
Run Code Online (Sandbox Code Playgroud)

翻译单位B:

#include <stdio.h>

extern volatile const int a;
void foo(void);

int main(void) {
    printf("%i\n", a);
    foo();
    printf("%i\n", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在ISO/IEC 9899:1999中,我刚刚发现(6.7.3,第5段):

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.

但在上面的例子中,对象没有定义为const(但只是声明).

UPDATE

我终于在ISO/IEC 9899:1999中找到了它.

6.2.7,2

引用同一对象或函数的所有声明都应具有兼容类型; 否则,行为未定义.

6.7.3,9

要使两种合格类型兼容,两者都应具有相同类型的兼容类型; [...]

所以,它未定义的行为.

c const extern

6
推荐指数
1
解决办法
460
查看次数

我们可以修改const变量的值吗?

这篇文章.

对于变量声明为另一个用途register,并const是抑制该变量的任何非本地的改变,甚至槽利用其地址,然后浇铸指针.即使你认为自己永远不会这样做,一旦你将一个指针(即使有一个const属性)传递给其他函数,你也永远无法确定这可能是恶意的并且改变你脚下的变量.

我不明白我们如何const通过指针修改变量的值.是不是未定义的行为?

const int a = 81;
int *p = (int *)&a;
*p = 42; /* not allowed */
Run Code Online (Sandbox Code Playgroud)

c const

6
推荐指数
1
解决办法
2489
查看次数

修改常量对象

我正在通过面试问题向初级C++开发人员的位置看.问题是(引用):

以下代码是否正确

struct Foo
{
    int i;
    void foo ( void ) const
    {
        Foo* pointer = const_cast<Foo*>(this);
        pointer->i = 0;
    }
};
Run Code Online (Sandbox Code Playgroud)

我会回答:

代码本身根据C++ 03和c ++ 11标准有效,并且将成功编译.但它可能在赋值指针 - > i = 0期间调用未定义的行为; 如果调用foo()的类的实例声明为const.

我的意思是下面的代码将成功编译并导致未定义的行为.

struct Foo
{
    int i;
    Foo ( void )
    {

    }
    void foo ( void ) const
    {
        Foo* pointer = const_cast<Foo*>(this);
        pointer->i = 0;
    }
};

int main ( void )
{
    Foo foo1;
    foo1.foo(); …
Run Code Online (Sandbox Code Playgroud)

c++ const constants undefined-behavior c++11

6
推荐指数
1
解决办法
252
查看次数

关于使用指针修改const变量的困惑

以下示例在我的理解中增加了混乱.我无法理解如何修改const变量local.请帮我理解一下.

 /* Compile code without optimization option */
 // volatile.c
 #include <stdio.h>
 int main(void)
 {
     const int local = 10;
     int *ptr = (int*) &local;

     printf("Initial value of local : %d \n", local);

     *ptr = 100;

     printf("Modified value of local: %d \n", local);

     return 0;
}
Run Code Online (Sandbox Code Playgroud)

$ gcc volatile.c -o volatile -save-temps

$ ./volatile

本地的初始值:10

修改后的本地值:100

c pointers const

6
推荐指数
1
解决办法
239
查看次数

使用const_cast的奇怪行为

我知道使用const_cast通常是坏主意,但我正在玩它,我遇到了一个奇怪的行为,其中:

两个指针具有相同的地址值,但在取消引用时,给出不同的数据值.

有没有人对此有解释?

#include <iostream>

int main()
{
    const int M = 10;

    int* MPtr = const_cast<int*>(&M);

    (*MPtr)++;

    std::cout << "MPtr = " << MPtr << "   (*MPtr) = " << (*MPtr) << std::endl;
    std::cout << "  &M = " << &M << "         M = " << M << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

产量

MPtr = 0x7fff9b4b6ce0   (*MPtr) = 11
  &M = 0x7fff9b4b6ce0         M = 10
Run Code Online (Sandbox Code Playgroud)

c++ pointers casting

3
推荐指数
1
解决办法
452
查看次数

使用指针更改const变量值

以下程序的输出在gcc上为50.怎么可能因为x是常量变量而*p是x本身,因为p是指向x处的值的常量指针.turbo c给编译器错误的地方.这是一个未定义的行为吗?请解释.

#include<stdio.h>

int main()
{
    const int x = 25;
    int * const p = &x;
    *p = 2 * x;
    printf("%d", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
322
查看次数

标签 统计

const ×7

c++ ×6

c ×4

pointers ×2

c++11 ×1

casting ×1

constants ×1

extern ×1

reference ×1

syntax ×1

undefined-behavior ×1