`

C的内存分配

    博客分类:
  • C
 
阅读更多

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

 


例子程序

//main.cpp

 

int a = 0; //全局初始化区 ,0直接写在此块区域
char *p1; //全局未初始化区 ,p1的值未知,或许为0
main() 
{ 
int b;// 栈区
char s[] = "abc"; //栈 ("abc"在栈中---不是字符串常量,这是个数组,s也是栈中地址常量,*s即为a)
char *p2;// 栈 
char *p3 = "123456";// 123456\0 在常量区,p3在栈上。 
static int c =0; //全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
//分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 
} 

 

char *a 与 char a[]的区别

 

char *a 定义的是字符指针, 它的值是可以改变的,
char *a="test string"; 会将字符串常量的地址直接赋值给a, 所以这个a的值可以返回给调用者

char a[] 定义的是字符数组, 它是指分配的一段内存空间的位置, 一旦分配就不要改变,
char a[]="test string"; 则是分配一块内存空间, 将字符串常量复制过来,

 

char *a="test string"; 只需要传入地址, 不另外分配内存空间,
char a[]="test string"; 则需要分配内存空间, 再复制字符串

 

 

 

 

分享到:
评论

相关推荐

    C语言内存分配.pdf

    在探讨C语言内存分配时,首先需要了解内存的基本概念。在计算机系统中,内存可以大致分为几个不同的部分,包括栈(stack)、堆(heap)、静态存储区(static/BSS段)和代码段等。栈用于存储局部变量和函数调用的上...

    c语言内存分配

    ### C语言内存分配详解 #### 一、C语言的4G虚拟寻址空间概念 在C语言中,每个进程都有一个4GB的虚拟地址空间。这个空间被划分为不同的区域来存储不同类型的变量和数据。这里提到的4G指的是4GB(即4 * 1024 * 1024 ...

    C语言内存分配问题C语言内存分配问题.docx

    C语言内存分配问题详解 在C语言中,内存分配是一个非常重要的概念。正确地分配和释放内存对于程序的正确性和性能至关重要。本文将详细介绍C语言中的内存分配问题,包括内存的四个区、动态分配和释放内存、避免内存...

    C语言内存分配

    ### C语言内存分配详解 #### 一、内存分配机制概览 C语言作为一种低级语言,提供了对内存的直接访问能力。程序运行时使用的内存主要分为五个不同的区域:栈区、堆区、全局区(静态区)、文字常量区以及程序代码区...

    C语言内存分配详解C语言内存分配详解.doc

    C语言内存分配详解 C语言中的内存分配是一个非常重要的概念,它对程序的执行和性能有着至关重要的影响。在本文中,我们将详细介绍C语言中的内存分配机制,包括栈、堆、全局区、文字常量区、程序代码区等几个部分的...

    明晰C 内存分配的五种方法的区别

    理解C内存分配的五种方法及其区别对于编写高效、无内存泄漏的代码至关重要。以下是这五种方法的详细介绍: 1. 栈内存分配:栈内存是由编译器自动管理的区域,主要用于存放函数参数、局部变量等。当函数调用时,这些...

    C语言内存分配问题(整理)

    ### C语言内存分配详解 #### 一、C语言中的内存分区 C语言中,内存主要分为四个区域: 1. **栈区**: - **用途**:用于存储函数的形参、局部变量以及函数调用过程中的相关信息。 - **管理机制**:由编译器自动...

    【C语言】C语言内存分配

    ### C语言内存分配详解 #### 一、野指针的概念及其管理 野指针是指一个指针指向了一个不可访问或者不明确的内存区域。在C语言中,由于开发者需要手动管理内存,不当的操作很容易产生野指针问题。例如,一个指针在...

    C语言内存分配详解

    在C语言中,内存管理是程序员需要关注的重要概念。内存主要分为四个区域:栈、堆、全局区(静态区)和文字常量区。每个区域都有其特定的用途和管理方式。 1. 栈(Stack): 栈是用于存放函数参数和局部变量的地方。...

    C语言内存分配代码.zip

    在C语言中,内存管理是程序员必须关注的重要部分。它涉及到如何为程序的变量和数据结构分配内存,...通过学习和实践这些C语言内存分配的代码,你可以更好地理解和控制程序对内存的使用,从而编写出更健壮、高效的程序。

    C内存分配算法之一最优先分配

    理解并正确实现内存分配算法对于编写高效且无内存泄漏的C程序至关重要。最优先分配算法尽管不是最快速的分配方法,但它在优化内存利用率和减少碎片方面表现出色,尤其适用于需要频繁分配和释放小内存块的场景。

    关于程序设计的内存分配问题

    不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆...(记得都是csdn里面找的) <br>tag: 操作系统 论文 内存分配 内存对齐 c语言内存分配 免费论文下载.doc

    c语言中动态内存分配问题

    在C语言中,动态内存分配是一项重要的编程技巧,它允许程序员在程序运行时根据需要分配内存,而不是在编译时预设固定的内存空间。本文将深入解析动态内存分配的细节和一个简单的C语言程序示例。 C语言提供了四个与...

    c语言内存分配[借鉴].pdf

    以下是对C语言内存分配的深入解析: 1. **虚拟寻址空间**:现代计算机通常使用32位或64位虚拟地址系统。对于32位系统,CPU的最大寻址能力是4GB(2^32字节),这被称为虚拟地址空间。这个空间被划分为多个区域,用于...

    C语言内存分配问题[归类].pdf

    理解C语言内存分配对于编写高效、无错误的代码至关重要。正确管理内存可以避免内存泄漏,提高程序性能,同时也能减少潜在的运行时错误,如栈溢出和无效指针引用。在编写程序时,应尽量利用栈来存储局部变量,因为它...

    操作系统 内存分配与回收 C语言模拟(含源代码和.exe文件)

    它提供了直接访问内存的机制,如`malloc`、`calloc`、`realloc`和`free`等函数,这些函数在C语言中用于动态内存分配和释放。 内存分配主要包括两种类型:静态内存分配和动态内存分配。静态内存分配在编译时完成,...

    动态内存分配与回收 c/c++

    在编程领域,尤其是在C/C++中,动态内存分配与回收是一项关键技能,它涉及到程序运行时内存的管理和优化。动态内存分配允许程序在运行时根据需要请求和释放内存,而不是在编译时就预设固定的内存空间。这使得程序...

    C语言的内存分配详解

    在C语言中,内存分配是程序管理资源的关键部分。它涉及到如何在运行时为变量和对象分配内存,以及何时和如何释放这些内存。本篇文章将深入探讨C语言的内存分配,特别是动态内存分配,以及与之相关的堆内存分配。 ...

    C语言的内存分配.pdf

    以下是关于C语言内存分配的一些关键知识点: 1. **内存分配的基本概念** - **内存分配**:在C语言中,内存分为四个主要区域:代码区、数据区、BSS区(未初始化数据区)和堆区。此外,还有一个栈区,用于函数调用时...

Global site tag (gtag.js) - Google Analytics