如何在c ++中为指针分配常量地址?

Via*_*iuk 3 c++ pointers const

我想检查当我增加/减少指针值时如何更改指针地址.

我的代码是:

void pointers_plus_minus()
{
    char *c = (char *) 0x7fff80ccd35c;
    int *i = (int *) 0x7fff80ccd35c;

    c++;
    i++;

    cout << "char pointer" << c << endl;
    cout << "int pointer" << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码给了我Segmentation fault (core dumped).

我明白地址有问题,但不清楚是什么.怎么解决?我正在使用64位Ubuntu.

Luc*_*ore 9

你不能操作像整数一样的指针(好吧,不是在定义明确的上下文之外).

你只被允许这样做c++,i++如果指针指向你拥有的数组.

哎呀,我认为这实际上定义得很好,因为1个元素被视为1的数组,并且允许你通过一个元素超越数组的末尾.但是从该指针读取仍然是未定义的.

无论如何,虽然未定义,但崩溃可能是因为cout << c尝试打印出字符串而不是指针.把它投到void*:

cout << "char pointer" << static_cast<void*>(c) << endl;
Run Code Online (Sandbox Code Playgroud)

虽然这会满足你的好奇心,这很好,但它仍然是未定义的,不应该这样做.


Kei*_*son 5

你问过如何为一个指针分配一个常量地址,但这样做(a)是非常不可移植的,并且(b)不一定能达到你的目的,即看到递增指针的效果.

这是一个程序,可以满足您的好奇心,而不会因未定义的行为而爆炸:

#include <iostream>
int main() {
    const int len = 10;
    char char_array[len];
    int int_array[len];

    char *cp = char_array;
    for (int i = 0; i <= len; i ++) {
        std::cout << "cp = " << static_cast<void*>(cp) << "\n";
        cp ++;
    }

    std::cout << '\n';

    int *ip = int_array;
    for (int i = 0; i <= len; i ++) {
        std::cout << "ip = " << static_cast<void*>(ip) << "\n";
        ip ++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我(64位)系统的输出是:

cp = 0x7fffaa5ddc30
cp = 0x7fffaa5ddc31
cp = 0x7fffaa5ddc32
cp = 0x7fffaa5ddc33
cp = 0x7fffaa5ddc34
cp = 0x7fffaa5ddc35
cp = 0x7fffaa5ddc36
cp = 0x7fffaa5ddc37
cp = 0x7fffaa5ddc38
cp = 0x7fffaa5ddc39
cp = 0x7fffaa5ddc3a

ip = 0x7fffaa5ddc00
ip = 0x7fffaa5ddc04
ip = 0x7fffaa5ddc08
ip = 0x7fffaa5ddc0c
ip = 0x7fffaa5ddc10
ip = 0x7fffaa5ddc14
ip = 0x7fffaa5ddc18
ip = 0x7fffaa5ddc1c
ip = 0x7fffaa5ddc20
ip = 0x7fffaa5ddc24
ip = 0x7fffaa5ddc28
Run Code Online (Sandbox Code Playgroud)

关于这一点的一些注意

指针增量是有效的,因为每个指针始终指向正确类型的数组的元素,或者刚好超过它的结尾.(你可以在数组的末尾构造一个指针;你不能取消引用这样的指针.)

打印类型指针时生成的输出void*是实现定义的.在我的系统上,它恰好是指针值的十六进制表示,被解释为它是一个整数 - 这可能是它最常见的方式.

您可以看到char*指针每次增加1,int*指针增加4.在我的系统(可能是您的系统)上,指针存储为字节地址.指针算术以指向类型为单位定义,而不是以字节为单位.增加int*指针使其指向前一个位置sizeof (int)之后的内存位置字节 - 在本例中为4个字节.所有指针算术都是这样定义的; ptr2 - ptr1为您提供两个地址之间的元素数量(无论何种类型ptr1ptr2指向).

打印的特定值告诉您有关如何在系统上管理内存地址的信息.指针和整数之间的映射通常会反映系统的内存模型.该模型主要针对具体实施.