繁体   English   中英

为什么不使用malloc就可以使用char指针?

[英]Why can I use a char pointer without malloc?

我已经编写了类似的东西,我想知道为什么它起作用...

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

理论告诉我,当我使用指针时,应该使用malloc分配空间。 但是在这种情况下,我不知道myString需要多少空间,因此我只是跳过了它。 但是为什么这样做呢? 仅仅是对我有用的不好的代码,还是char指针后面有什么特别的东西?

它的工作完全是偶然的。 下次尝试时可能不起作用。 未初始化的指针可以指向内存中的任何地方。 对其进行写操作可能会导致立即访问冲突,或者稍后会出现问题,或者一无所获。

这通常是错误的代码,是的。 同样,无论您使用什么编译器,都可能不是很聪明,或者关闭了警告,因为它们通常会引发错误或至少发出警告,例如“变量未初始化未使用的变量”,这完全是事实。 不幸的是,当代码运行时,点很垃圾,而操作系统以某种方式允许写入(或读取),可能是在调试模式下运行? 我的个人经验是,在某些情况下,它可以预测操作系统的运行方式,但是您永远都不应依赖这些东西,例如,如果您在调试模式下使用MinGW进行构建,则非初始化值通常遵循一个模式或为零,在这种情况下,发布其通常完整的随机垃圾。

由于您“指向内存位置”,因此无论何时它是另一个变量(指向另一个变量)或在运行时分配空间(malloc),它都必须指向有效位置,因此您基本上都不是读/写一个随机内存块,并且由于某些黑魔法,该应用不会因此而崩溃,您是否正在Windows上运行? Windows 2000或XP? 由于我知道自Windows Vista以来,这些限制并不像Windows那样严格,因此我记得当时我在Windows XP下做了类似的事情,当它崩溃时什么也发生。

因此,通常,在使用指针之前先分配或指向要使用的内存块,以防不知道需要使用多少内存来重新分配内存,或者只是想出一种针对特定情况占用最小内存的好的策略。

了解C实际作用的一种方法是更改​​此行

char* myString;

进入

char* myString=(char*)0;

并在调试器的该行之前中断并观看myString变量,该变量将为垃圾,如果将变量加为零,则其余代码将失败,并出现访问冲突,因为您指向“ nowhere”。 正常操作是

char* myString=(char*)malloc(125); // whatever amount you want

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM