- 浏览: 146088 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
先看一段代码:
[cpp] view plaincopy
#include<iostream>
using namespace std;
void GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
return 0;
}
该代码运行崩溃,原因是str并没有实际获得指针p开辟的内存空间。在函数GetMe中,p实际上是主函数中str的一个副本,p申请了内存,只是把p指向的内存地址改变,而str并没有改变,所以str依然没有获得内存,在执行字符串复制时就会出错。而且每次p申请的内存都不会得到释放,最终会造成内存泄露。
我们可以更改以上代码如下:
[cpp] view plaincopy
#include<iostream>
using namespace std;
char* GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
return p;
}
int main()
{
char *str=NULL;
str=GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
[cpp] view plaincopy
<span style="white-space:pre"> </span>delete str;
return 0;
}
在该代码中我们为p申请了空间,并将该空间的地址作为返回值传给str,这样str就指向了p申请的内存空间。还有一种修改方法是:传递str的指针:
[cpp] view plaincopy
#include<iostream>
using namespace std;
void GetMe(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(&str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
delete str;
return 0;
}
在该代码中传递了str的指针给函数GetMe(),那么p就是str的地址的副本,地址的副本可定就是该地址了,所以该函数是为str地址指向的str开辟空间。所以能正确输出结果。
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 union myunion{
5 char charvar;
6 int intvar;
7 float floatvar;
8 };
9 void swap(int ** p1, int **p2)
10 {
11 //会产生临时变量,所以使用二级指针
12 int *tmp;
13
14 tmp = *p1;
15 *p1 = *p2;
16 *p2 = tmp;
17 }
18
19
20 int main()
21 {
22
23 union myunion *uni = malloc(sizeof(float));
24
25 int a= 10, c= 20;
26 int *aa = &a;
27 int *cc = &c;
28 fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
29 swap(&aa,&cc);
30 printf("swap ...........");
31 fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
32 fprintf(stdout,"a is:%d\t b is: %d\n", a, c);// 不变,变的只是指针本身指向的地址而已
33
34 printf("---------------\n");
35
36 free(uni);
37
38 return 0;
39 }
[cpp] view plaincopy
#include<iostream>
using namespace std;
void GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
return 0;
}
该代码运行崩溃,原因是str并没有实际获得指针p开辟的内存空间。在函数GetMe中,p实际上是主函数中str的一个副本,p申请了内存,只是把p指向的内存地址改变,而str并没有改变,所以str依然没有获得内存,在执行字符串复制时就会出错。而且每次p申请的内存都不会得到释放,最终会造成内存泄露。
我们可以更改以上代码如下:
[cpp] view plaincopy
#include<iostream>
using namespace std;
char* GetMe(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);
return p;
}
int main()
{
char *str=NULL;
str=GetMe(str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
[cpp] view plaincopy
<span style="white-space:pre"> </span>delete str;
return 0;
}
在该代码中我们为p申请了空间,并将该空间的地址作为返回值传给str,这样str就指向了p申请的内存空间。还有一种修改方法是:传递str的指针:
[cpp] view plaincopy
#include<iostream>
using namespace std;
void GetMe(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
}
int main()
{
char *str=NULL;
GetMe(&str,100);
strcpy(str,"Hello!");
cout<<str<<endl;
delete str;
return 0;
}
在该代码中传递了str的指针给函数GetMe(),那么p就是str的地址的副本,地址的副本可定就是该地址了,所以该函数是为str地址指向的str开辟空间。所以能正确输出结果。
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 union myunion{
5 char charvar;
6 int intvar;
7 float floatvar;
8 };
9 void swap(int ** p1, int **p2)
10 {
11 //会产生临时变量,所以使用二级指针
12 int *tmp;
13
14 tmp = *p1;
15 *p1 = *p2;
16 *p2 = tmp;
17 }
18
19
20 int main()
21 {
22
23 union myunion *uni = malloc(sizeof(float));
24
25 int a= 10, c= 20;
26 int *aa = &a;
27 int *cc = &c;
28 fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
29 swap(&aa,&cc);
30 printf("swap ...........");
31 fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
32 fprintf(stdout,"a is:%d\t b is: %d\n", a, c);// 不变,变的只是指针本身指向的地址而已
33
34 printf("---------------\n");
35
36 free(uni);
37
38 return 0;
39 }
发表评论
-
c语言链表实现学生管理
2013-10-28 14:13 865#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4661#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2858gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1288负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 858if(NULL == fgets(msg,100,stdi ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1503>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 652总结: -2> int * a = NUL ... -
c语言api
2013-07-31 21:06 637原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 588#define SS sizeof(int) 5 int ... -
判断两个一个链表是否存在循环(C专家编程中的问题)
2013-06-24 15:35 872判断两个一个链表是否存在循环(C专家编程中的问题) #incl ... -
atoi源码
2013-05-14 19:32 1222原文: http://blog.csdn.net/eroswa ... -
c语言特殊字符串复制
2013-05-06 01:59 8232.strcpy和memcpy主要有以下3方面的区别。 2.1 ... -
《APUE》:线程和fork(父子进程锁)
2013-04-29 21:07 1106《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在 ... -
Linux多线程同步的几种方式
2013-04-22 22:49 731Linux多线程同步的几种方式 线程的最大特点是资 ... -
sphinx 安装
2013-04-10 19:54 502[@zw-76-80 soft]$ rpm -ivh MySQ ... -
防止pause和alrm产生竞争
2013-04-08 22:51 7631 #include<stdio.h> 2 ... -
关于linux环境下信号SIGCHLD的排队机制
2013-04-07 22:13 1487下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中 ... -
alarm与pause
2013-04-07 20:12 7061 #include<stdio.h> 2 ... -
Linux下的定时器
2013-04-07 20:05 611Linux下的定时器有两种,以下分别介绍: 1、 ... -
linux 信号量
2013-04-04 22:24 619目录 SIGCHLD 描述 编辑本段SIG ...
相关推荐
C++动态内存分配 ,为C++软件工程师提供对内存的管理的了解.
C和C++动态内存分配如堆,栈,数据段
本章首先介绍程序运行时动态内存分配(dynamic memory allocation)的概念与方法。到目前为止,本教材介绍的程序设计中,变量和对象在内存中的分配都是编译器在编译程序时安排好了的,这带来了极大的不便,如数组...
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...
C++动态内存分配研究.pdf
本文介绍了C++中内存的分配方式及动态内存分配中常见的内存错误及处理方法.
c++动态分配内存的介绍,对c++内存有很好的介绍
操作系统 动态 内存分配与回收 ,包含各种分配算法 c/c++
动态内存分配 操作系统 实验报告 C++
C++内存分配
用C++实现 vector 分配内存 避免溢出
C++程序内存分配详解。堆与栈的比较。new/delete与malloc/free比较。
主要介绍了详解C++ 动态内存分配与命名空间,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
对于c++动态分配内存问题对于初学者来说是一件很头痛的事,本文档详细讲述该类问题,令初学者恍然大悟!其实非常简单1
c++五种分配内存 c++五种分配内存 c++五种分配内存 c++五种分配内存
今天小编就为大家分享一篇关于关于C++动态分配内存的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧