c语言指针

C语言 malloc函数

半世苍凉 提交于 2019-12-05 14:21:38
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/flowing_wind/article/details/81240910 谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。 1、关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的1 如果分配成功:则返回指向被分配内存空间的指针 不然返回指针NULL 同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。 关于:void*,表示未确定类型的指针,c,c++规定void*可以强转为任何其他类型的指针,关于void还有一种说法就是其他任何类型都可以直接赋值给它,无需进行强转,但是反过来不可以 malloc: malloc分配的内存大小至少为参数所指定的字节数 malloc的返回值是一个指针,指向一段可用内存的起始位置,指向一段可用内存的起始地址,多次调用malloc所分配的地址不能有重叠部分

对malloc与free函数的浅识

空扰寡人 提交于 2019-12-05 07:26:09
  本文介绍malloc和free函数的内容。   在C中,对内存的管理是相当重要。下面开始介绍这两个函数:   一、malloc()和free()的基本概念以及基本用法: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 2、函数的用法: 其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子: 程序代码: // Code... char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr)   {    exit (1);    } gets(Ptr); // code... free(Ptr); Ptr = NULL; // code... 就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针

悬空指针与野指针

前提是你 提交于 2019-12-05 07:25:14
一、悬空指针 C语言中的指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。下面这段C语言代码是一个例子,请看: void *p = malloc(size); assert(p); free(p); // 现在 p 是“悬空指针” C语言中的“悬空指针”会引发不可预知的错误,而且这种错误一旦发生,很难定位。这是因为在 free(p) 之后,p 指针仍然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用 p 并不会引发错误。 所以在实际的C语言程序开发中,为了避免出现“悬空指针”引发不可预知的错误,在释放内存之后,常常会将指针 p 赋值为 NULL: void *p = malloc(size); assert(p); free(p); // 避免“悬空指针” p = NULL; 这么做的好处是一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。 二、野指针 上面我们讲的“悬空指针”是指向被释放内存的指针,“野指针”则是不确定其具体指向的指针。“野指针”最常来自于未初始化的指针,例如下面这段C语言代码: void *p; // 此时 p 是“野指针” 因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误

C语言学习笔记--关于指针的一些小认知

送分小仙女□ 提交于 2019-12-05 05:12:18
int main() { int i; char *str = "hu mian yuan"; int length = strlen(str); printf("str的长度=%d\n", length); for (i = 0; i < length; i++) { printf("%c", *(str+i)); } return 0; } 对于刚刚接触指针的人来说,不免会对指针有一些小困惑,认为指针不是一般用来存储地址而已嘛,为什么有时候又可以像上面一样char *str="hu mian yuan";直接复值呢? 其实上面这种写法也只是赋地址而已,它实际的意义是吧这一字符串的第一个字母的地址赋给str;然后通过指针加一的方式,把所有指针地址都遍历,并且转换成%c形式,输出。 来源: https://www.cnblogs.com/hmy-666/p/11908712.html

C++类的定义和对象

时光总嘲笑我的痴心妄想 提交于 2019-12-05 01:51:46
C++类的定义和对象 类的成员变量称为类的属性(Property),将类的成员函数称为类的方法(Method)。在面向对象的编程语言中,经常把函数(Function)称为方法(Method)。 类的定义 class Student{ public: //成员变量 char *name; int age; float score; void say(){ cout<<name<<age<<score<<endl; } }; 类只是一个模板(Template),编译后不占用内存空间. class C++ 中新增的关键字,用来定义类。 成员变量和成员函数,它们统称为类的成员(Member) 创建对象: Student Lilei; //创建对象 Student 是类名, liLei 是对象名。和使用基本类型定义变量的形式类似, 从这个角度考虑,我们可以把 Student 看做一种新的数据类型,把 liLei 看做一个变量。 在创建对象时,class 关键字可要可不要 class Student LiLei; //正确 Student LiLei; //同样正确 还可以创建对象数组: Student allStu[100]; 使用对象指针: Student stu; //pStu 是一个指针,它指向 Student 类型的数据,通过 Student 创建出来的对象 Student

c/c++——基本概念

跟風遠走 提交于 2019-12-05 01:01:16
内存 栈区和堆区的管理模式有所不同:栈区内存由系统分配和释放,不受程序员控制;堆区内存完全由程序员掌控,想分配多少就分配多少,想什么时候释放就什么时候释放,非常灵活。 栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的用途就是完成函数的调用。 栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就备足所有内存。这称为动态内存分配。 在栈上创建出来的对象都有一个名字,比如 stu,使用指针指向它不是必须的。但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。 栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。在实际开发中,new 和 delete 往往成对出现,以保证及时删除不再使用的对象,防止无用内存堆积。 有了对象指针后,可以通过箭头 -> 来访问对象的成员变量和成员函数,这和通过 结构体指针 来访问它的成员类似。 成员变量在堆区或栈区分配内存,成员函数在代码区分配内存

手绘知识点——指针入门

吃可爱长大的小学妹 提交于 2019-12-05 00:08:12
距离上篇博客整整一个月了,秋招的黄金期,感觉自己的节奏和去年此时的师兄师姐完全不在一个频道上,找工作真的是玄学,真的是有缘千里来相聚啊,不多说了,祝福每位毕业季的同学(比心)~ 一直以来都想搞一个手工画图系列,以自己的理解落实到具体的纸面上,这样更加清晰明了,今天先来第一棒,也是“当头一棒”,悄悄地进入指针的大世界~ 记得大一刚开始接触C语言时还是很感兴趣的,当时重点关注的网站是“编程中国”,也向很多人推荐过,但现在这个网站感觉要废了,时不时地崩一下,内容和排版也一直都没啥改进,但这依然不妨碍我对它的热爱,其中C语言的教程堪称经典,至今都将其奉若圭臬,现在就开始小小地谈论一波指针吧,可能会比较浅显,慢慢来,任重而道远。 关于指针的定义想必大家都了然于胸了,我们通常所说的指针全名应该是“指针变量”,也就是存放指针的变量,而指针则是指的“内存地址”,落实到具体的C程序中指针就是我们存放数据的内存地址,直接看例子吧: #include <stdio.h> int main(){ int a = 1; double b=3.1415; int *pa = &a; double *pb = &b; printf("a的地址:%#x\n", &a); printf("pa的地址:%#x\n", &pa); printf("*pa的地址:%#x\n", &*pa); printf("pb的地址:

C语言结构体用法

半城伤御伤魂 提交于 2019-12-04 22:01:48
结构体(struct) 结构体是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。 结构体中可以使用不同的数据类型。 1. 结构体说明和结构体变量定义 在Turbo C中, 结构体也是一种数据类型, 可以使用结构体变量, 因此, 像其它类型的变量一样, 在使用结构体变量时要先对其定义。  定义结构体变量的一般格式为: struct 结构体名 { 类型 变量名; 类型 变量名; ... } 结构体变量; 结构体名是结构体的标识符不是变量名。 构成结构体的每一个类型变量称为结构体成员, 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构体是按变量名字来访问成员的。 下面举一个例子来说明怎样定义结构体变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构体名为string的结构体变量person, 如果省略变量名 person, 则变成对结构体的说明。用已说明的结构体名也可定义结构体变量。这样定义时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float

go指针

左心房为你撑大大i 提交于 2019-12-04 21:24:10
go指针 Go语言为程序员提供了控制数据结构指针的能力,但是,并不能进行指针运算。Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这对于构建运行良好的系统是非常重要的。指针对于性能的影响不言而喻,如果你想要做系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。 指针(pointer)在Go语言中可以被拆分为两个核心概念: 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。 切片,由指向起始元素的原始指针、元素数量和容量组成。 受益于这样的约束和拆分,Go语言的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移,从而避免了非法修改关键性数据的问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。 切片比原始指针具备更强大的特性,而且更为安全。切片在发生越界时,运行时会报出宕机,并打出堆栈,而原始指针只会崩溃。 C/C++中的指针 说到 C/C++ 中的指针,会让许多人“谈虎色变”,尤其是对指针的偏移、运算和转换。 其实,指针是 C/C++ 语言拥有极高性能的根本所在,在操作大块数据和做偏移时即方便又便捷。因此,操作系统依然使用C语言及指针的特性进行编写。 C/C++ 中指针饱受诟病的根本原因是指针的运算和内存释放,C/C++ 语言中的裸指针可以自由偏移

8大数据结构

…衆ロ難τιáo~ 提交于 2019-12-04 20:58:37
数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。 1 、数组 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从 0 开始。例如下面这段代码就是将数组的第一个元素赋值为 1 。 int[] data = new int[100]; data[0] = 1; 优点: 1 、按照索引查询元素速度快 2 、按照索引遍历数组方便 缺点: 1 、数组的大小固定后就无法扩容了 2 、数组只能存储一种类型的数据 3 、添加,删除的操作慢,因为要移动其他的元素。 适用场景: 频繁查询,对存储空间要求不大,很少增加和删除的情况。 2 、栈 栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。 栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。 3 、队列 队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出