我是一名c ++学习者。其他人告诉我" uninitiatied指针可能指向任何地方"。如何通过代码证明。我做了一个小测试代码,但我的未经指向的指针总是指向0.在这种情况下,它不指向0?感谢
#include <iostream>
using namespace std;
int main() {
int* p;
printf("%d\n", p);
char* p1;
printf("%d\n", p1);
return 0;
}
答案 0 :(得分:4)
根据定义,任何未初始化的变量都有一个不确定的值,直到提供一个值,甚至访问它是未定义的。因为这是未定义行为的灰色区域,所以你无法保证未初始化的指针不是0
。
您编写的任何内容都证明了这一点,这取决于您运行的编译器和系统。
如果你真的想,你可以尝试编写一个用垃圾值填充本地数组的函数,并创建另一个定义未初始化指针并打印它的函数。在main()
中的第一个函数之后运行第二个函数,您可能会看到它。
编辑:为了您的好奇心,我使用此代码在我的系统上展示了VS2015的行为:
void f1()
{
// junk
char arr[24];
for (char& c : arr) c = 1;
}
void f2()
{
// uninitialized
int* ptr[4];
std::cout << (std::uintptr_t)ptr[1] << std::endl;
}
int main()
{
f1();
f2();
return 0;
}
打印16843009
(0x01010101
)。但同样,这都是未定义的行为。
答案 1 :(得分:1)
嗯,我认为证明这个问题是不值得的,因为应该使用一个好的编码风格,这就是:初始化所有变量!一个例子:如果你“释放”一个指针,只需给它们一个像这个例子中的值:
string
这是一种安全和良好的风格。此外,如果您偶然再次使用let number = 123456
let array = String(number).characters.map{Int(String($0)) ?? 0}
,它将不会崩溃您的程序!在此示例中 - 如果在执行char *p=NULL; // yes, this is not needed but do it! later you may change your program an add code beneath this line...
p=(char *)malloc(512);
...
free(p);
p=NULL;
后未将free(p)
设置为NULL
,则可以再次错误地使用指针,并且程序将尝试解决已释放的内存 - 这会破坏您的程序或(更糟糕)可能以奇怪的结果结束。
因此,不要浪费时间对指针指向p
的情况提出疑问。只需为变量(指针)设置值! : - )
答案 2 :(得分:0)
这取决于编译器。您在旧版MSVC2008上执行的代码以发布模式显示(普通随机):
1955116784
1955116784
并且在调试模式下(在使用单位指针使用后呱呱叫):
-858993460
-858993460
因为该实现在调试模式下将未初始化的指针设置为0xcccccccc以检测它们的用法。
标准规定使用未初始化的指针会导致未定义的行为。这意味着来自标准的任何事情都可能发生。但是一个特定的实现可以随心所欲地做任何事情:
(*)至少我找不到任何参考......