当前位置: 首页 > 知识库问答 >
问题:

堆栈和堆的内存分配量(c)

孙渝
2023-03-14

我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    int i;
    char *str1 = "hello";
    char str2[] = "hello";
    char *str3 = (char*)malloc(strlen(str2));
    //free code
    return 0;
}

我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包括'/0')。我错过了什么?堆栈的18个字节来自哪里?提前感谢您的帮助!

共有1个答案

魏襦宗
2023-03-14
int i; // 4 stack bytes
char *str1 = "hello"; // 4 stack bytes (pointing to a read only string constant)
char str2[] = "hello"; // 6 stack bytes (containing a 6 byte string)
char *str3 = (char*)malloc(strlen(str2)); // 4 stack bytes (pointing to heap memory from malloc)

总计:18个堆栈字节

这是一个理想主义的计算,现实可能更复杂。它仍然是理解记忆的有用模型。

 类似资料:
  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 在这个练习中,你会在难度上做一个大的跳跃,并且创建出用于管理数据库的完整的小型系统。这个数据库并不实用也存储不了太多东西,然而它展示了大多数到目前为止你学到的东西。它也以更加正规的方法介绍了内存分配,以及带领你熟悉文件处理。我们使用了一些文件IO函数,但是我并不想过多解释它们,你可以先试着自己理解。 像通常一样,输入下面整个程序,并且使之正常工作,之后我们会进行讨论: #include <stdi

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(

  • 本文向大家介绍Java中的堆栈和堆内存之间的区别,包括了Java中的堆栈和堆内存之间的区别的使用技巧和注意事项,需要的朋友参考一下 JVM将内存空间分为两部分,一个是堆栈,另一个是堆空间。堆栈空间主要用于存储方法执行的顺序和局部变量。 堆栈始终按照LIFO顺序存储块,而堆内存使用动态分配来分配和取消分配内存块。  分配给堆的内存将一直存在,直到发生以下事件之一: 程序终止  无记忆  相反,分配给

  • 本文向大家介绍java 中堆内存和栈内存理解,包括了java 中堆内存和栈内存理解的使用技巧和注意事项,需要的朋友参考一下  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存