指针以及内存的分配

转载 2016年05月31日 23:17:52

1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int  *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int  *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里.

 

2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现:

  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. int main()  
  4. {  
  5.     //第一种  
  6.     int *p1 = (int*)malloc(sizeof(int)); //动态的在堆上分配一块内存(手动分配)  
  7.     scanf("%d",p1);  
  8.     printf("%d/n",*p1);  
  9.     free(p1);  //释放内存  
  10.   
  11.     //第二种  
  12.     int  i;           //由系统自动在栈上分配一块内存  
  13.     int  *p2 = NULL;    
  14.     scanf("%d",&i);  
  15.     p2 = &i;          //将p2指向栈上i的内存  
  16.     printf("%d/n",*p2);  
  17.   return 0;    
  18. }  

 

3. 不知道你是否知道我为什么没有在第二种方法后也加free(p2)?如果加了free(p2)编译器会报内存错误,因为p2指向的是i内存,i的内存是在

栈上,栈上的内存都是由系统管理,如分配和释放,不需要手动管理,这里使用free(p2)是在释放i的内存,这块内存不需要你管,你却使用free()管理当然会报错,

 

4. 动态分配内存,在C语言中是使用malloc()分配和使用free()释放,在C++中,是使用new分配和delete释放,都是在堆上分配,malloc()括号内是内存的大小,是size_t(unsigned int)类型,free()括号内是内存的地址或是指向这块内存的指针,new是C++的重载函数,new+大小,

delete+地址;具体的用法看代码:

  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include <iostream>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     //第一种  
  8.     int *p1 = new int//动态的在堆上分配一块内存(手动分配)  
  9.     scanf("%d",p1);  
  10.     printf("%d/n",*p1);  
  11.     delete p1;  //释放内存  
  12.      
  13.     //第二种用法  
  14.     int  *p2 = new int[3]; //分配3块int类型大小的内存空间  
  15.     int  i =0;  
  16.     while(i<3)  
  17.     {  
  18.         scanf("%d",&p2[i]);   
  19.         i++;  
  20.     }  
  21.     delete [] p2; //注意这个释放方式  
  22.   
  23.     //第三中用法  
  24.     int *p3 = new int(45); //分配一块内存,并将45存放到这块内存中  
  25.     printf("%d/n",*p3);  
  26.     delete p3;  
  27.       
  28.   return 0;    
  29. }  

 

第二种方式我依次输入的是56,78,23,下图是p2的存储方式

 




分布式爬虫以及Scrapy源码剖析

信息时代,数据为王,互联网包含了迄今为止最有用的数据集,并且大部分可以免费公开访问,但是由于数据被嵌入在众多网站的结构和样式中导致难以被复用,应运而生出现了网络爬虫,使用程序自动获取互联网上的资源。本系列课程将带你开发自动化程序实现数据自动采集,针对众多网站防止数据被获取采取防爬虫方案,课程中包含对防爬策略所有解决方法,以及如何提高爬虫性能,爬虫方向真正做到“遇鬼杀鬼,遇神杀神,所向披靡”。
  • 2017年09月22日 10:25

指针和内存分配一个最基本理解

本次笔记主要是针对指针的动态内存分配和 内存分配的机制做一个简单的感悟,最后的蓝色字体是我自己的感悟,如果您看到这块,恳请您指出我的错误。感谢!!...
  • zhangweiiou
  • zhangweiiou
  • 2015-07-12 11:12:09
  • 2477

c/c++指针详解(二)----内存分配

1、内存分配的三种方式: 1)、从静态存储区分配。数据的内存在程序编译时已经被分配,该内存在整个运行期间长期驻留,不会被释放;程序结束时,由操作系统自动释放。这类数据包括静态数据和全局数据。 2)、从...
  • xbk123123
  • xbk123123
  • 2016-11-21 19:09:45
  • 1229

使用malloc为指针分配内存空间

#include #include //使用malloc 自己创建数组空间 --操作一维数组 int main(void){ const int N = 6; int * p_num...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2017-03-19 21:18:34
  • 2192

c++内存空间分配与指针探讨

C中内存类型和布局:  (1)栈区(stack):由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。 (2)堆区(heap):由程序员手动分配和释放,由malloc或new来分配,fre...
  • zengxiaosen
  • zengxiaosen
  • 2016-09-25 19:20:22
  • 491

指针未被分配内存

#include using namespace std; int main() { string s("i love you!"); string *str ; *str=...
  • vbarry215
  • vbarry215
  • 2015-08-29 14:41:55
  • 434

Go学习笔记四(指针与内存分配)

Go指针 内存分配 用 new 分配内存 用 make 分配内存 定义自己的类型 类型转换 字符串转换 数值转换 用户定义类型的转换Go指针Go 有指针,但是没有指针运算。你不能用指针变量遍历字符串的...
  • liuzp111
  • liuzp111
  • 2017-01-03 18:13:30
  • 1290

结构体指针内的指针变量成员的内存分配

但凡有指针的内存分配,都必须为每个指针变量单独分配内存空间!
  • H542723151
  • H542723151
  • 2015-02-02 23:22:36
  • 5852

C语言,指针与内存分配

指针变量与内存分配 1. char * str1; //str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存 中拷贝内容将出错。利用malloc动态分配...
  • xiaotong0202
  • xiaotong0202
  • 2016-03-11 09:22:57
  • 2543

C语言中为指针的指针动态分配内存空间的做法

前言:本人在学习数据结构的过程中,遇到了散列这种数据结构,在使用分离链表发构建散列的过程中,需要用到为指针的指针动态分配内存空间,所以本人写了一个C语言的Demo程序来先测试这一行为问题如图#incl...
  • qq_32884717
  • qq_32884717
  • 2017-04-02 15:14:38
  • 1219
收藏助手
不良信息举报
您举报文章:指针以及内存的分配
举报原因:
原因补充:

(最多只允许输入30个字)