如何使用未分配的内存?

奥斯卡·珀森(Oskar Persson)

使用以下程序怎么不会出现任何错误?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
  char *pStr = (char*) malloc(25); 
  free(pStr); 
  strcpy(pStr, "foo");
  printf("%s\n", pStr);
  return 0;
}

不应该free(pStr)阻止我写那个地址吗?我不必在使用之前再次分配空间吗?

丹尼尔

free只要语法正确,它就不会阻止您执行任何操作。因此,char*如果您从未从未分配过内存,那么仍然非常欢迎将其复制到一个副本但这是未定义的行为,很容易(可能会)导致您的程序崩溃或在没有警告的情况下做错了什么。

例如,如果您的编译器进行了一些优化,为了节省时间,它可能会对某些指令重新排序。由于您已经释放了内存,因此编译器可能会认为在该位置为稍后将要创建的其他数据分配内存是安全的。如果优化器将该分配移动并写入您的位置strcpy,则可以覆盖存储此处的对象。

考虑以下代码:

int main(int arc, char *argv[]){
    char* pStr = (char*) malloc(25);
    free(pStr);
    strcpy(pStr, "foo");
    printf("%s\n", pStr);
    int* a = (int*) malloc(sizeof(int));
    *a = 36;
    printf("%d\n", *a);
}

既然你写信给未分配的内存,你可以不知道什么任何的的printf旨意显示。36个字符可能已经覆盖了某些“ foo”字符串。“ foo”字符串可能已覆盖a指向的值36 也许它们都不会对彼此产生影响,并且您的程序似乎运行得很好,直到您更改某个变量的名称并重新编译,并且由于某种原因,即使您没有进行任何更改,所有内容都被弄乱了。

故事的寓意:您正确的是,您不应该写入freed内存;但是,您不能写入freed内存是不正确的C不会检查这种情况,并假定您正在尝试做一些花哨的事情。如果您确切地知道编译器如何优化以及在malloc调用时它将在哪里分配内存,那么您可能会知道在特定情况下写入未分配的内存是安全的,并且C不会阻止您这样做。但时间是你不知道的99.999%的一切,只是没有做到这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理我未分配的内存

来自分类Dev

关于使用malloc()成功写入未分配内存的困惑;

来自分类Dev

如何使Boot Camp使用未分配的空间?

来自分类Dev

访问未分配的内存C ++

来自分类Dev

使用未分配的变量?

来自分类Dev

使用未分配的参数

来自分类Dev

使用未分配的变量?

来自分类Dev

从未分配的内存读取是否安全?

来自分类Dev

malloc未分配指定的内存(64位)

来自分类Dev

C#中未分配变量的内存

来自分类Dev

如何使用GParted合并两个未分配的分区?

来自分类Dev

如何使用GParted合并两个未分配的分区?

来自分类Dev

如何使用未分配的属性创建Javascript构造函数/原型?

来自分类Dev

如何使用未分配的空间扩展根分区?

来自分类Dev

如何使用未分配的大小增加 sdd4 大小?

来自分类Dev

使用字符串时无法复制未分配内存的malloc示例

来自分类Dev

使用未分配的变量-for循环

来自分类Dev

使用未分配的本地错误

来自分类Dev

正确使用未分配的变量?

来自分类Dev

无法使用未分配的空间

来自分类Dev

如何使用 gparted 从 VBox 动态驱动器分配未分配的空间

来自分类Dev

如何避免最大的内存分配并发使用?

来自分类Dev

如何让 NodeJS 使用所有分配的内存

来自分类Dev

向量化strlen摆脱了读取未分配的内存

来自分类Dev

内存未分配(嵌入式uC MSP430)

来自分类Dev

为什么我获得未分配内存的读写权限?

来自分类Dev

Valgrind说尝试访问动态数组时未分配内存

来自分类Dev

为什么我要获得未分配内存的读写权限?

来自分类常见问题

ElasticSearch:未分配的碎片,如何解决?