- 浏览: 153388 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 899#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4725#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2995gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1354负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 906if(NULL == fgets(msg,100,stdi ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1555>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 688总结: -2> int * a = NUL ... -
c语言api
2013-07-31 21:06 676原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 624#define SS sizeof(int) 5 int ... -
判断两个一个链表是否存在循环(C专家编程中的问题)
2013-06-24 15:35 912判断两个一个链表是否存在循环(C专家编程中的问题) #incl ... -
atoi源码
2013-05-14 19:32 1260原文: http://blog.csdn.net/eroswa ... -
c语言特殊字符串复制
2013-05-06 01:59 8632.strcpy和memcpy主要有以下3方面的区别。 2.1 ... -
《APUE》:线程和fork(父子进程锁)
2013-04-29 21:07 1168《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在 ... -
Linux多线程同步的几种方式
2013-04-22 22:49 775Linux多线程同步的几种方式 线程的最大特点是资 ... -
sphinx 安装
2013-04-10 19:54 535[@zw-76-80 soft]$ rpm -ivh MySQ ... -
防止pause和alrm产生竞争
2013-04-08 22:51 8311 #include<stdio.h> 2 ... -
关于linux环境下信号SIGCHLD的排队机制
2013-04-07 22:13 1541下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中 ... -
alarm与pause
2013-04-07 20:12 7631 #include<stdio.h> 2 ... -
Linux下的定时器
2013-04-07 20:05 647Linux下的定时器有两种,以下分别介绍: 1、 ... -
linux 信号量
2013-04-04 22:24 666目录 SIGCHLD 描述 编辑本段SIG ...
相关推荐
### C++动态内存分配:掌握高效编程的关键 在C++编程的世界里,动态内存分配是一项核心技能,它赋予程序员在运行时决定数据存储大小的能力,从而优化资源管理和提高程序的灵活性。本文将深入探讨C++中的动态内存...
### C++动态内存分配研究 #### 一、内存分配方式 C++作为一种强大的面向对象编程语言,继承了C语言的基础并引入了许多高级特性。在C++中,内存管理是一项复杂而重要的任务,对于提高程序的稳定性和性能至关重要。...
C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...
操作系统动态内存分配是计算机科学中一个关键的概念,尤其是在C++编程语言中。动态内存分配允许程序在运行时根据需要请求和释放内存,而非在编译时预设固定的内存大小。这种方式提高了程序的灵活性,但同时也增加了...
### C和C++中的动态内存分配详解:堆、栈、数据段 #### 一、C语言中的内存区域 在C语言中,程序运行时的内存主要分为以下几个区域: 1. **栈区**:由编译器自动分配和释放。主要用于存放函数调用时的局部变量、...
在C++编程中,动态内存分配是一个至关重要的概念,它涉及到程序在运行时根据需要分配和释放内存。本文深入探讨了C++中的内存分配方式、动态内存管理的关键运算符new和delete,以及如何应对常见的内存错误。 首先,...
C++ 动态内存分配与命名空间 C++ 动态内存分配是指在程序运行时根据需要动态分配内存空间的机制。C++ 提供了 new 关键字来实现动态内存分配。new 关键字可以根据类型来进行动态内存分配,而不是像 C 语言那样基于...
在编程领域,尤其是在C/C++中,动态内存分配与回收是一项关键技能,它涉及到程序运行时内存的管理和优化。动态内存分配允许程序在运行时根据需要请求和释放内存,而不是在编译时就预设固定的内存空间。这使得程序...
在C++编程语言中,动态内存分配主要通过`new`和`delete`关键字来实现。本实验报告主要探讨了如何模拟动态内存分配的过程,以加深对操作系统内存管理的理解。 实验目的在于设计一个能够模拟内存分配状态的程序,通过...
c++动态分配内存的介绍,对c++内存有很好的介绍
理解并熟练掌握Windows内存管理和C++内存分配对于编写高效、可靠的程序至关重要。通过合理的内存管理,我们可以避免内存泄漏、提高程序性能,并确保系统的稳定性。在实践中,结合使用各种内存分配策略,可以更好地...
C++动态分配内存介绍 C++动态分配内存是指在程序执行过程中,根据需要动态地分配和释放内存的过程。这种机制允许程序根据需要申请和释放内存,从而提高内存的使用效率。 内存管理器(Memory Manager,简称MM)是...
C++内存分配详解 在C++编程中,内存管理是一个重要的概念,因为它直接影响到程序的性能和资源使用。内存主要分为四个主要区域:栈区、堆区、全局区(静态区)以及文字常量区。下面我们将详细探讨这些区域以及它们...
C++实现动态分配内存 C++中的 vector 是一个多功能的容器,可以存放各种类型的对象,简单地说,vector 是一个能够存放任意类型的动态数组,可以动态改变大小。下面是对 vector 的详细介绍: 1. vector 的概述 ...
C++内存分配情况 C++内存分配是C++编程中的一個重要概念,它涉及到内存的管理和分配。在C++中,内存分成五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。每个区的特点和使用场景都不同,了解这些区的...