首页 文章

C [重复]中的静态和动态内存分配

提问于
浏览
1

这个问题在这里已有答案:

为什么以下猜测是错误的? (一位软件工程公司经理告诉我,这几乎是正确的,但我不明白为什么,我不能在互联网上搜索答案..)

int* ptr = new int;      // Sorry I mistyped before

我的主张:

  • left part(ptr)是静态内存分配 .

  • right part(new int)是动态内存分配 .

//新编辑:2015年1月1日17:39(UTC 08:00)
我在想的是,它将堆栈指针向下移动(或向上移动?)以释放 ptr 的空间 . 并为 new int 找到一个空的空间 . 然后将 new int 的地址存储到 ptr .

4 回答

  • -2

    你的说法是正确的 .

    left part(ptr)是静态内存分配 . right part(new int)是动态内存分配 .

    换句话说,右边部分返回 int * ,a(动态分配) pointer to int . 您无法将其分配给 int 类型的(静态分配)变量 .

  • 2

    左边是 int ,右边是创建 int * (指针)

    你要:

    int * ptr = new int;
    

    或者如果你想做静态分配

    int num; // = 5; Will initialize num to 5
    
  • 0

    我想解释一些关于你的代码的事情 .

    那个部分

    new int
    

    被认为是“动态分配”,但实际上它是在堆内存中分配的 .

    声明

    int ptr
    

    不被认为是“静态分配”而是被认为是“自动”,因为它被分配在堆栈内存中 . 请注意,堆比堆栈大很多(Windows中每个线程的默认堆栈大小为1MB),因此您将无法在堆栈上分配大型数组 . 另一方面,堆在理论上具有4GB的内存地址空间,尽管只有2GB可用于进程,并且它也是虚拟内存而不是物理上的 .

    现在,由于您将ptr表示为整数类型(而不是指针),编译器将失败,因为您尝试将内存地址分配给非指针类型 . 因此,您需要明确告诉编译器这是您的意图,并通过将内存分配(只是一个32位地址)转换为int来告诉编译器:

    int ptr = (int)new int; //allocate an int on the heap and cast the address to an int value
    

    问题是现在ptr将保存一个32位数字,它是堆中内存分配的起始地址 . 你现在不能对这个ptr做太多的事情,因为编译器把它当作一个简单的整数而不是一个指针,所以为了用它做一些有意义的事情(而不是只是将地址保存在整数值中),你需要将它转换为指针而不是使用它 . 例如,用一些值初始化地址(假设值为5):

    (*(int*)ptr) = 5; //cast to pointer and dereference it.
    

    正如您所看到的,语法现在变得“难看”并且很难阅读/理解 . 如果你以'正确'的方式做事,你就会这样写:

    int* ptr = new int;
    
    *ptr = 5;  //dereference the pointer
    

    还有一件事,关于指针算术:由于你的ptr只是一个整数而不是一个指针,当你递增它时:

    int ptr = new int; //Assume ptr got the address 0x010
    ptr++;
    //Now ptr will hold the value of 0x011 because the value just got incremented by 1.
    

    但如果ptr是一个真正的指针:

    int* ptr = new ptr; //Assume ptr got the address 0x010
    ptr++;
    //Now ptr will hold the value of 0x014 because the size of an int is 4 bytes
    //and the pointer now points to the next address after the allocated integer.
    
  • 0

    因为你使用'int *'类型的右值无效的'int'类型的变量初始化 . 您应该将后者转换为'size_t',它应该可以工作 .

    int ptr = (size_t)new int;
    

    在那之后访问'ptr'的实际值你应该写:

    *(int*)ptr
    

    生活example .

相关问题