- 浏览: 1588043 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
内存的分配何管理一直让许多c++爱好者头痛不已,不仿看看下面的东西!
来自林锐的《高质量c++编程指南》
指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函
数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?
void GetMemory(char *p, int num)//zbf:感觉非常隐蔽,设计错误
{
p = (char *)malloc(sizeof(char) * num);
}
|
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str
仍然为 NULL
strcpy(str, "hello"); //
运行错误
}
|
示例7-4-1 试图用指针参数申请动态内存
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。(注意其原理解释)
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-4-2。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
} |
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); //
注意参数是 &str,而不是str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
|
示例7-4-2用指向指针的指针申请动态内存
由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例7-4-3。
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
} |
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
|
示例7-4-3 用函数返回值来传递动态内存
用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。
char *GetString(void)
{
char p[] = "hello world";//用数组
return p; //
编译器将提出警告
}
|
void Test4(void)
{
char *str = NULL;
str = GetString(); // str
的内容是垃圾
cout<< str << endl;
}
|
示例7-4-4 return语句返回指向“栈内存”的指针
用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,但是str的内容不是“hello world”
而是垃圾。
如果把示例7-4-4改写成示例7-4-5
,会怎么样?
char *GetString2(void)
{
char *p = "hello world";//用指针
return p;
}
|
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
|
示例7-4-5 return语句返回常量字符串
函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。
程序运行如下:
vc->File->new->c++source file
#include "iostream.h"
#include "stdio.h"
#include "string.h"
#include "malloc.h"
void GetMemory(char *p,int num);
void Test(void);
void GetMemory2(char **p,int num);
void Test2(void);
char *GetMemory3(int num);
void Test3(void);
char *GetString(void);
void Test4(void);
char *GetString2(void);
void Test5(void);
void main()
{
// Test();
Test2();
Test3();
Test4();
Test5();
}
void GetMemory(char *p,int num)//设计错误,却非常隐蔽
{
p=(char*)malloc(sizeof(char)*num);
}
void Test(void)
{
char *str=NULL;
GetMemory(str,100);
strcpy(str,"hello");
cout<<str<<endl;
}
void GetMemory2(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);
}
void Test2(void)
{
char *str=NULL;
GetMemory2(&str,100);//注意参数传递
strcpy(str,"hello");
cout<<str<<endl;
free(str);//保持与malloc的配对
}
char *GetMemory3(int num)
{
char *p = (char*)malloc(sizeof(char)*num);
return p;
}
void Test3(void)
{
char *str=NULL;
str=GetMemory3(100);
strcpy(str,"hello");
cout<<str<<endl;
free(str);//保持与malloc的配对
}
char *GetString(void)
{
char p[]="hello";
return p;//warning:return address of local variable or temporary(数组属于局部变量)
}
void Test4(void)
{
char *str=NULL;
str=GetString();
cout<<"以下内容为垃圾: ";
cout<<str<<endl;
}
char *GetString2(void)
{
char *p="hello";
return p;
}
void Test5(void)
{
char *str=NULL;
str=GetString2();
cout<<str<<endl;
}
运行结果:
hello
hello
以下内容为垃圾:(随意的内容)
hello
发表评论
-
COM(Component Object Model)组件介绍
2013-01-15 17:38 1519COM component(COM组件)是微软公司为了计算机 ... -
scanf的用法
2012-05-31 23:37 1465scanf()函数的用法和实 ... -
定义计算变量相对于结构体偏移量的宏
2012-05-30 22:42 2819#include <stdio.h> #incl ... -
C语言一些有用的宏定义
2012-05-30 22:36 1768C语言宏定义技巧(常用宏定义) 写好C语 ... -
C语言const
2012-05-30 14:35 1261原文地址:http://hi.baidu. ... -
C语言void指针
2012-05-29 09:50 13621.概述 本文将对void关键字的深刻含义进行解说,并 ... -
C语言中#line 宏说明
2012-05-28 09:38 1845c语言里有个很少用到的宏 #line,这个宏通常是和__LIN ... -
C语言中宏的一些特别用法
2012-05-28 09:36 1726转载 C语言中如何使用宏C(和C++)中的宏(Macro)属 ... -
C语言编译执行的全过程
2012-05-28 09:13 1238编译,编译程序读取源程序(字符流),对之进行词法和语法的分 ... -
C++新型头文件与名称空间的作用
2012-05-25 09:06 18701.20 新型头文件与名字 ... -
程序在内存中运行的奥秘
2010-07-01 12:18 1843内存管理是操作系统的核心功能,无论对于开发者还是系统管理员内存 ... -
堆和栈的区别
2010-06-29 10:56 1650栈是随函数被调用时分 ... -
原码,补码,反码(针对byte(128) = -128的问题)
2010-06-25 16:40 4139int a = 128; byte b = (byte)a; ... -
链表常见笔试题
2010-06-25 11:22 3467链表的一些常见笔试面试问题总结及代码 ... -
C与C++中struct的区别,以及C++中struct与Class的区别
2010-06-25 10:44 4197C中struct只可以放成员变量,没有访问权限限制,外部可以访 ... -
C++中的inline用法总结
2010-05-26 22:26 18810inline函数的作用 ... -
C++枚举类型用途及定义详解
2010-05-26 21:14 4579C++编程语言作为一种功 ... -
C++ Template 中的typename、class关键字区别
2010-05-19 19:27 3323在c++Template中很多地 ... -
C++与Java比较(转)
2010-04-30 23:02 4461“作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概 ... -
几款常见C++编译器的比较
2010-04-30 22:58 5727另外,就我个人的一点点经验来看,vs 2005中的C++编译器 ...
相关推荐
在编程世界里,C 和 C++ 语言中的指针是一个至关重要的概念,它们为程序员提供了直接访问内存的能力,使得高效编程成为可能。本篇将详细阐述指针的相关知识点,包括其定义、用法、操作以及常见陷阱。 首先,我们要...
本文将详细介绍C/C++中指针的各种用法,并通过具体的例子帮助读者掌握这些知识。 #### 复杂类型声明的解析原则 理解复杂类型的声明是掌握指针的基础。通常,这些声明包含多个修饰符(如`*`和`[]`),这些修饰符...
DEVC++是一款基于Windows平台的轻量级C/C++集成开发环境,由Bloodshed Software开发。这个工具提供了源代码编辑器、编译器、调试器等组件,方便初学者和专业开发者进行C语言编程。在DEVC++中,指针是C语言中极其重要...
5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位...
一个由C/C++编译的程序在运行时,其占用的内存可以大致分为以下几个部分: 1. **栈区(Stack)**: - 由编译器自动分配和释放,主要用于存放函数的参数值、局部变量的值等。 - 其操作方式类似于数据结构中的栈,...
总结一下,C++中的指针函数和函数指针提供了强大的灵活性,使得程序能够在运行时动态地决定执行哪个函数,或者将特定的行为作为参数传递。这种灵活性在设计复杂系统和实现高级算法时非常有用。熟练掌握这两个概念,...
通过对C/C++中指针常量与常量指针的深入理解,我们不仅能够更灵活地运用这些概念来编写高效可靠的代码,还能够更好地避免常见的编程错误,提升程序的整体质量。正确区分并运用这两种指针类型,对于开发高质量的C/C++...
#### 三、C/C++中指针学习的两个绝好例子 1. **指针的基本操作**: - 定义指针:`int *p;` - 分配内存:`int *p = new int;` - 释放内存:`delete p;` - 指向数组:`int arr[5]; int *p = arr;` - 动态数组:`...
2、C++中指针和引用的区别 指针有自己的一块空间,而引用只是一个别名; 使用 sizeof 看一个指针的大小为4字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小; 指针可以被初始化为 NULL,而...
8. **指针与面向对象编程**:介绍C++中指针如何在类和对象中工作,特别是作为成员变量和成员函数返回值的情况。 9. **指针在实际项目中的应用**:通过案例分析,展示指针在解决实际问题和优化算法性能上的重要性。 ...
免费的C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法... C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...
这两个实验都展示了C++中指针的强大功能,它们可以用来传递和修改变量的值,以及作为函数间数据交换的媒介。同时,这些实验也展示了如何通过函数来组织和分解复杂的任务,使得代码更易于理解和维护。通过这样的练习...
指针的使用是两者的重要区别,C#对指针的使用进行了限制,主要在 unsafe 代码块中使用,而C++中指针使用更为灵活,但也更易引发错误。 运算符重载在C#中受到限制,只允许重载一部分运算符,C++则允许更多的自由度。...
C++中指针和引用的区别 - **指针**:指向变量地址的变量;可以通过解引用操作符访问指向的值。 - **引用**:别名,提供另一个访问现有变量的方式;不存在空引用。 #### 5. constchar*, charconst*, char*const的...
C++中指针和引用的区别 - **指针**可以被重新指向不同的对象。 - **引用**一旦被初始化为一个对象,就不能改变引用的对象。 - 引用必须在声明时被初始化,而指针可以在任何时候被初始化。 ### 6. const char*, ...
#### 一、C/C++中指针学习的关键:概念清晰 在C++中,指针被视为一种强大的工具,它允许程序员直接操作内存地址,从而实现对数据的灵活控制。然而,对于初学者而言,指针往往是一大难题,主要原因在于对指针的基本...
- 虽然标题中提到“Visual C”,通常在现代开发环境中指的是Visual C++,这是一款集成开发环境,用于编写C++代码,同时也支持C语言。在本项目中,可能是用来编写与ASM代码交互的高级语言部分,比如设置初始化参数,...