为什么我可以使用没有malloc的char指针?

我编写了类似的东西,我想知道为什么它有效……

char* produceAString(void){ char* myString; while(somethingIsGoingOn){ //fill myString with a random amountof chars } return myString; } 

该理论告诉我,当我使用指针时,我应该使用malloc来分配空间。 但在这种情况下,我不知道myString需要多少空间,因此我只是跳过了它。 但为什么这样呢? 它只是糟糕的代码,幸运地为我工作,或者在指针背后有什么特别之处?

这通常是错误的代码,是的。 此外,您使用的任何编译器可能都不是非常智能或关闭警告,因为它们通常会抛出错误或至少发出警告,例如“使用未初始化的变量”,这是完全正确的。 你运气不好,当代码运行时,这个点就是垃圾,不知何故操作系统允许写入(或读取),可能你是在调试模式下运行的? 我个人的经验是,在某些情况下,它可以预测操作系统会做什么,但你永远不应该依赖这些东西,一个例子是如果你在调试模式下使用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 

由于纯粹的机会,它起作用了。 下次尝试时可能无法正常工作。 未初始化的指针可以指向内存中的任何位置。 写入它们可能会导致即时访问冲突,或者稍后会出现的问题,或者根本没有任何问题。