【发布时间】:2019-09-07 00:51:52
【问题描述】:
我最近对指针很好奇,我不明白为什么以下不起作用。
我的想法是创建一个变量,说它的地址(十进制),要求用户输入它并将其作为指向前一个变量的指针的地址。最后两个变量应该具有相同的值。
最后一个指针指向一个错误的内存地址,因为它有段错误,但是当我打印指针的地址时,它们是相同的!
#include <iostream>
int main() {
int temp = 0;
printf("Temporary integer addr 0x%x (dec %d)\n", &temp, &temp);
int input = -1;
printf("Give me an address to read (in dec)\n");
std::cin >> input;
printf("You chose the number %d (hex 0x%x)\n", input, input);
int* intPtr = (int*)input;
int* tempPtr = &temp;
if (intPtr == tempPtr) {
printf("It works, they are equal!\n");
} else {
printf("Expected: 0x%x got 0x%x\n", tempPtr, intPtr);
printf("Expected value: 0x%d got 0x%d", temp, *intPtr); // segfaults
}
return 0;
}
这是控制台输出
Main function addr 0xb0ddf7d0 (dec -1327630384)
Temporary integer addr 0xb0ddf7c8 (dec -1327630392)
Give me an address to read (in dec)
-1327630392
You chose the number -1327630392 (hex 0xb0ddf7c8)
Expected: 0xb0ddf7c8 got 0xb0ddf7c8
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
它有什么问题?如何创建指向用户输入地址的指针? 我在 g++ (GCC) 8.2.1 20181127 上编译它
【问题讨论】:
-
我想知道 gcc 是否在某处假设未定义的行为,所以假设指针从不匹配,所以完全删除检查?
-
另外,这不是一个最小的例子。
mainPtr行没有理由 -
是的,抱歉,我应该删除这些内容
-
如果您将
input变量声明为long long int,会发生什么? -
尝试使用
std::uintptr_t而不是int,因为它可以保证适合指针。
标签: c++