我编写了类似的东西,我想知道它为什么会起作用......
char* produceAString(void){
char* myString;
while(somethingIsGoingOn){
//fill myString with a random amountof chars
}
return myString;
}
理论告诉我,当我使用指针时,我应该使用malloc来分配空间。但在这种情况下,我不知道myString需要多少空间,因此我只是跳过了它。 但为什么这有效呢?它只是糟糕的代码,幸运地对我有用,或者在指针背后有什么特别的东西?
答案 0 :(得分:5)
由于纯粹的机会,它起作用了。它可能在您下次尝试时无效。未初始化的指针可以指向内存中的任何位置。写入它们可能会导致即时访问冲突,或者稍后会出现的问题,或者根本没有任何问题。
答案 1 :(得分:1)
这通常是错误的代码,是的。此外,您使用的任何编译器可能都不是非常智能或关闭警告,因为它们通常会抛出错误或至少发出警告,例如“使用未初始化的变量”,这是完全正确的。 你运气好(运气好的话)当代码运行时,这个点就是垃圾,不知何故操作系统允许写入(或读取),可能你是在调试模式下运行的? 我个人的经验是,在某些情况下,它可以预测操作系统将会做什么,但你永远不应该依赖这些东西,例如,如果你在调试模式下使用MinGW构建,那么未初始化的值通常遵循一个模式或零,发布构建其通常完整的随机垃圾。
由于你“指向一个内存位置”,它必须指向一个有效的位置,只要它是另一个变量(指向另一个变量)或在运行时分配空间(malloc)你正在做的事情既不是你基本上阅读/写一个随机的内存块,由于一些黑魔法,应用程序不会因为这个而崩溃,你在Windows上运行吗? Windows 2000还是XP?因为我知道那些不像Windows那样具有限制性,我记得在那天我在Windows XP下做了类似的事情而且没有什么发生了它应该崩溃的时候。
所以一般来说,在你使用指针之前分配或指向你想要使用的内存块,以防你不知道需要多少内存使用realloc,或者只是简单地找出一个对你的特定占用空间最小的好策略情况下。
查看C实际执行的操作的一种方法是更改此行
char* myString;
到
char* myString=(char*)0;
并使用调试器在该行之前中断并观察myString变量,它将是垃圾,如果它将变量intalize它将为0,那么其余代码将因访问违规而失败,因为您指向“无处”。 正常的操作是
char* myString=(char*)malloc(125); // whatever amount you want