`
beck5859509
  • 浏览: 110340 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

跟我一起学习C(内存篇)

 
阅读更多
    上一小节跟我一起学习C(指针篇1)介绍了指针的基本用法及原理,这章主要介绍C对内存分配的管理。写到这里大家自然会联想到JVM运行时的内存分配,C程序会不会也像JAVA一样类似的处理方式呢?
    
    JAVA内存管理

    每个JVM程序在启动时根据脚本参数设置内存大小。主要设置堆大小(-Xmx、-Xms设置)、非堆大小(-PermSize、-MaxPermSize),以及内存回收策略(并行UseParallelGC、并发CMS)。

    以并行回收为例:
    程序中new出来的对象存放在堆区。jconsole下截图


    静态数据、字符串常量、class方法等存放在非堆区。


    以上只是JVM存放数据的物理图,而实际程序运行时数据区涉及到(堆、栈、方法区、程序计数器),这些不在本章中介绍,但它们的数据就是存放在以上两个图中的。
    可见JAVA的内存是事先指定好的,如果我们程序中产生的对象不断增加,而GC又回收不了,达到或接近Xmx值时就会报Outofmemory。

    C内存管理

    C的处理方式和JAVA类似么?我们先不急着回答这个问题。来看看编译链接出来的目标文件格式。比如hello.c编译完成以后生成hello,来看一下其内部结构。

    目标文件的大小为7944个字节,而源文件只有320字节。再看第二个红圈中的几个内容及对应解释:
  
    text(代码区):代码段由各个函数产生,函数的每一个语句将最终经过编绎和汇编生成二进制机器代码。

    data(数据区):程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。

    bss(未初始化数据区):存放的是全局未初始化变量(包括静态和全局)

    dec(十进制大小):以上几部份内容的10进制之和
    hex(十六进制大小):以上几部份内容的16进制之和

    由此可见上图中运行时的内存是没有分配的,包括栈和堆的数据。栈数据主要是方法内的私有变量、方法参数、临时数据等。方法运行完后自动释放空间,而堆是由程序动态分配的大小,可动态扩张或缩减(可以理解成java中new出来的对象,既然new一个对象,至少得知道这个对象要占多大空间,所以先分配空间,然后再往空间中设值,比如一个Person(包括姓名,身份证号)的结构体,就先开辟一个空间,这才可以装下姓名和身份证号[/size]),具体C中就表现为操作malloc和free函数。

使用malloc和free的例子。
   
void mallocTest(char *q, int size){
    q = (char *)malloc(size);  
    //往新申请的空间中设置字符串  
    strcpy(q, "hello world!!!");  
    printf("%s\n", q);  

}

int main() {
	char *ptr = NULL; 
	mallocTest(ptr, 128);
	free(ptr);
	return 0;
}

   
    虽然上面的程序运行没问题,但是内存泄露了,free(p)实际上是free(null),在mallocTest方法中申请的空间没有释放掉。其实这和传参是有关系的。mallocTest方法中指针本身的地址和ptr的本身地址是不一样的(说白了不是同一个变量,只是指针的值都指向null,这个地方和JAVA的传参一样,都是值传递;地址传递只是指针的值是一样的,而形参指针和实参指针本身的地址,实际是两个不同变量),q在mallocTest方法中最后是指向了新分配的空间。如下测试
  
void mallocTest(char *q, int size){
	printf("pointer2 ---->%p\n",&q);
	q = (char *)malloc(size);
	strcpy(q, "hello world!!");
	printf("%s\n", q);
}

int main() {
	char *ptr = NULL;
	printf("pointer1 ---->%p\n",&ptr);
	mallocTest(ptr, 128);
	free(ptr);
	return 0;
}


      正确的写法
方法1:把函数中的指针返回出来,再赋值给主函数的指针。
char * mallocTest(char *q, int size){
	q = (char *)malloc(size);
	strcpy(q, "hello world!!");
	printf("%s\n", q);
	return q;
}

int main() {
	char *ptr = NULL;
	ptr = mallocTest(ptr, 128);
	free(ptr);
	return 0;
}


方法2:使用二级指针,在mallocTest中改变一级指针的值,一级指针指向新申请的空间地址。
void mallocTest(char **q, int size){
	*q = (char *)malloc(size);
	strcpy(*q, "hello world!");
	printf("%s\n", *q);
}

int main() {
	char *ptr = NULL;
	mallocTest(&ptr, 128);
	free(ptr);
	return 0;
}


A机器防火墙设置禁止访问地址B
1、/etc/sysconfig/iptables 中添加
-A INPUT -s 10.1.1.53/32 -j DROP
-A INPUT -s 10.0.0.0/8 -j ACCEPT

2、/etc/init.d/iptables reload  执行生效

3、service iptables stop
   service iptables status
   service iptables start
0
2
分享到:
评论

相关推荐

    非常好的C语言巩固学习资料,对于提升C语言能力很有帮助,尤其详细介绍了C指针,结构体等重点

    通过深入学习C指针,你可以更好地理解内存管理,提高程序性能,并掌握高级编程技巧,如指针运算和指针数组等。 结构体是C语言中组织数据的强大工具,它允许我们将不同类型的数据组合成一个单一的复合类型。结构体在...

    c语言学习全套课件.zip

    1. **基础篇**:这部分通常涵盖C语言的基本语法,如变量、数据类型(整型、浮点型、字符型等)、常量、运算符、表达式以及控制结构(顺序、选择、循环)。此外,还会讲解如何进行输入输出操作,如使用`printf`和`...

    一些c语言学习的小论文

    这篇小论文集合可能会为那些希望深入学习C语言的同学提供有价值的见解和指导。 在C语言的学习过程中,有几个关键知识点不容忽视: 1. **基本数据类型**:C语言提供了多种基本数据类型,如int(整型)、char(字符...

    学习C语言的必备基础知识.doc

    "学习C语言的必备基础知识" 本文概述了学习C语言的基础知识,包括计算机和数据存储、计算机组成部分、指令和数据、程序和编译、存储器分类、操作系统等重要概念。 首先,学习C语言需要了解计算机的组成部分,包括...

    C语言资料大全(适合所有层次的C语言学习者)

    同时,C语言提供了直接的内存管理功能,"内存管理"部分会讲解动态内存分配与释放,帮助你理解和避免内存泄漏问题。 四、结构体与联合体 结构体和联合体是C语言中处理复杂数据结构的关键。它们允许你将不同类型的...

    c的笔记c的笔记

    这篇笔记将深入探讨C语言的核心概念、语法结构以及编程实践,旨在帮助学习者掌握C语言的基础知识。 一、C语言概述 C语言由Dennis Ritchie在1972年为UNIX操作系统设计,因其简洁、高效和强大的特性,迅速成为程序员...

    C语言进阶.pdf

    《C语言进阶.pdf》是一本专为初级C程序员和嵌入式程序员设计的进阶教程,旨在帮助读者深入理解并提升C语言编程能力。在C语言的学习过程中,理解和掌握其重点、难点以及常见疑点至关重要,这不仅关乎编程基础的稳固,...

    c语言学习指导性教程

    这篇指导性教程旨在帮助初学者和有经验的程序员更好地理解和掌握C语言的核心概念。 首先,我们从基础开始。C语言的基本结构包括变量声明、常量、数据类型、运算符和表达式。变量是存储数据的容器,而数据类型则决定...

    C语言进阶.rar(PDF版本)

    《C语言进阶》这份资料主要涵盖了C语言的高级主题,包括但不限于指针操作、内存管理、预处理器、函数指针、位运算、文件操作、结构体与联合体、链表以及递归等方面的知识。以下是这些主题的详细解析: 1. **指针...

    结构体C语言高级进阶篇PPT学习教案.pptx

    《结构体C语言高级进阶篇》PPT学习教案详细解析 在C语言中,结构体(Struct)是一种复合数据类型,它允许我们将多种不同类型的变量组合在一起,形成一个新的类型,便于管理和处理复杂的数据结构。这在实现如学校...

    c语言学习课件

    这篇学习课件涵盖了C语言的核心概念,旨在帮助初学者快速掌握这一技术。以下是对这些知识点的详细解析: 1. **基本语法**:C语言的语法结构严谨,包括变量声明、数据类型(如int、char、float等)、运算符(算术、...

    C语言编程教材

    "C语言编程教材"是学习C语言的基础资源,通常会按照章节逐步深入,帮助初学者理解并掌握C语言的核心概念和技术。 一、基础篇: 1. **数据类型**:C语言提供了多种基本数据类型,如整型(int)、浮点型(float、...

    明解C语言 第3版.pdf

    通过阅读《明解C语言》第三版,读者不仅可以掌握C语言的基本概念和技术,还能培养良好的编程习惯和思维方式,为后续的编程学习打下坚实的基础。 总之,《明解C语言》第三版是一本非常适合初学者的C语言教程,其...

    2022年C语言实习心得5篇精选集合最新.docx

    理解这些基本数据类型及其在内存中的表示是学习C语言的基础。 2. **数据转换与处理**: - 学习C语言的过程中,会涉及到不同类型数据之间的转换,如将整型转换为浮点型,或者字符型与整型的相互转换。 3. **数组与...

    C语言学习ppt,从基础到深奥

    **C语言学习PPT概述** C语言是一种强大的、低级的编程语言,广泛应用于系统编程、嵌入式开发、软件工程等多个领域。本资源“C语言学习ppt”旨在为初学者提供一个逐步深入学习C语言的平台,从基础知识开始,逐步过渡...

    C语言经典编程900例

    5. **结构体与联合体**:结构体允许将不同类型的变量组合在一起,而联合体则共享同一块内存。它们是处理复杂数据结构的基础。 6. **内存管理**:包括动态内存分配(如malloc, calloc, realloc, free)和内存泄漏的...

    C语言课件 C语言概述

    指针是C语言的一大特色,它允许直接操作内存地址,可以用于动态内存分配、函数参数传递和高级数据结构的实现。结构体则允许将不同类型的数据组合在一起,形成复合数据类型。 7. **C语言程序设计——提高篇** 提高...

    c语言软件 好用的软件制作

    本篇文章将深入探讨C语言在软件制作中的应用,以及如何利用C语言进行高效、好用的软件开发。 1. **C语言基础**: - C语言的基础包括变量、数据类型(如int, float, char等)、运算符、控制结构(如if语句,for循环...

    C语言学习笔记

    这篇学习笔记将深入探讨C语言的核心概念和技术,旨在帮助初学者掌握这门语言的基础知识。 首先,C语言的基础部分包括变量、数据类型和常量。变量是存储数据的容器,有整型(int)、浮点型(float/double)、字符型(char...

    2022年c语言上机报告范文【四篇】.docx

    4. **结构体与联合**:结构体允许我们将不同类型的数据组织在一起,而联合则允许在相同的内存空间内存储不同类型的变量,这是C语言中面向数据结构编程的关键。 5. **文件操作**:学习C语言还需要了解如何进行文件的...

Global site tag (gtag.js) - Google Analytics