C关于指针和内存的那些大事
对于C的指针使用和内存分配,我想每一个C程序员在使用时都心惊胆寒,至少我是这样的.
现在我终于找到了自己的圣经,那就是林锐博士在他的<<高质量C/C++编程>>里讲的知识,在这里感谢林锐老师写了这本书,让我和向我一样对pointer&&memory感到恐惧的人找到了希望.不废话了,进入主题:
**********************************************************************************************
内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多
少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期
由我们决定,使用非常灵活,但问题也最多。
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩
溃。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:可能是乱码。
因为GetMemory 返回的是指向“栈内存”
的指针,该指针的地址不是 NULL,但其原
现的内容已经被清除,新内容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:
(1)能够输出hello
(2)内存泄漏
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预
料,非常危险。
因为free(str);之后,str 成为野指针,
if(str != NULL)语句不起作用。
**********************************************************************************************
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);
}
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”.由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。
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);
}
**********************************************************************************************
用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return 语句用错
了。这里强调不要用return 语句返回指向“栈内存”的指针,因为该内存在函数结束时
自动消亡
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
void Test4(void)
{
char *str = NULL;
str = GetString(); // str 的内容是垃圾
cout<< str << endl;
}
用调试器逐步跟踪Test4,发现执行str = GetString 语句后str 不再是NULL 指针,
但是str 的内容不是“hello world”而是垃圾。
char *GetString2(void)
{
char *p = "hello world";
return p;
}
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
函数Test5 运行虽然不会出错,但是函数GetString2 的设计概念却是错误的。因为
GetString2 内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内
恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。
c++编程网
分享到:
相关推荐
【C语言基础面试题——指针和内存】 在C语言中,指针和内存管理是核心概念,对于理解和编写高效程序至关重要。以下是一些相关的知识点: 1. **内存模型**: - 内存可以被想象成一列火车车厢,每个车厢代表一个...
"C++指针面试题经典"这个资源,很可能是针对C++开发者,特别是初级到中级水平的程序员设计的面试题集合,旨在测试和提升他们在指针方面的理解与应用能力。金山公司的面试题历来以深度和实用性著称,这些题目和解答...
文章整理了近两年来10个关于智能指针的问题,并且将这些面试问题编号序号,所有的面试题都在文章里面有答案,在文章中以上标的形式标出了对应的地方,方便大家查阅和重新阅读。在文章的最后,会根据文章讲解的内容和...
本资料包聚焦于“C C++ 指针 面试题 笔试题”,旨在帮助学习者或求职者提升对指针的掌握程度,从而在面试和笔试中脱颖而出。 1. **指针基础知识**:指针是C和C++中的一个特殊变量类型,它存储的是内存地址,可以...
有关C语言指针的经典面试题集合,C语言面试宝典
指针面试题精华 以下是对指针面试题的知识点总结: 1. 结构体指针 在C语言中,结构体可以使用指针来访问其成员。例如,在`test1`函数中,定义了一个结构体`struct node`,然后使用指针`p`来访问其成员变量。注意...
内存分配是计算机程序中的一项基本操作,指针作为编程语言中的核心概念之一,与内存分配紧密相关...在编程实践中,应当加深对内存和指针操作的理解,注意各种可能的陷阱和最佳实践,这样可以在编程时做出更明智的决策。
3. 关于内存释放和指针操作的面试题: 这个面试题中,考察的是指针操作和内存释放的顺序。在Objective-C中,如果一个指针指向了某个对象,而在对象的生命周期结束后,该指针如果没有重新赋值,它就变成了野指针。在...
本资源摘要信息涵盖了恺壹软件初级软件工程师面试题的重要知识点,包括编程语言基础知识、指针和内存管理、程序改错题、数据结构和算法、数组和矩阵运算、结构体和联合体、计算机网络基础知识、指针运算和数组、函数...
这份“有关C语言的面试题集”涵盖了多个重要的知识点,包括VC(Visual C++)调试和内存管理,这些都是C程序员必须掌握的核心技能。 首先,我们要讨论的是C语言的基础。C语言是一种强大的低级编程语言,它提供了对...
面试题是评估求职者技能和知识的重要方式,特别是在IT领域。以下是对提供的面试题的详细解答: 1. **字符串翻转方法**: 实现字符串翻转,可以使用双指针技术,一个从字符串开头开始,另一个从末尾开始,交换它们...
1. 描述栈内存和堆内存的区别。 2. 解释内存泄漏的原因和如何避免。 3. 什么是野指针?如何产生?如何避免? 4. 分析动态内存分配与静态内存分配的优缺点。 5. 请解释C++中的深拷贝和浅拷贝,以及在内存管理中的影响...
"说明.txt"可能包含了对代码的解释和使用指南,而"易语言源码视频教程下载.url"则可能是相关教程资源的链接,帮助进一步理解和学习E语言的指针和内存操作。 总之,熟练掌握指针和内存操作对于E语言开发者来说是提升...
根据给定的信息,我们可以整理出一系列与C++相关的面试题及知识点解析,下面将逐一进行详细阐述。 ### C++ 面试题知识点解析 #### 1. 预处理器指令 预处理器是编译器执行的第一步,在实际编译之前处理源代码。预...
这些题目涉及指针的基础知识、指针运算、内存管理等方面,适合用来测试对C语言指针的理解和运用能力。 1. 基础题目 1.1 指针基本概念 题目: 请解释什么是指针?指针在C语言中的作用是什么? 答案: 指针是一个变量...
3. **c++面试题300.rar**:这300道题目涵盖了C++的广度和深度,包括面向对象编程、异常处理、多态性、内存模型等,旨在考察面试者的全面理解和实践能力。 4. **11-C++经典面试100题.pptx**:PPT形式的题目集,以...
根据提供的信息,我们可以总结出以下关于“华为C语言面试题”的相关知识点: ### C语言基础知识 1. **数据类型**:在C语言中,需要掌握各种基本数据类型(如`int`、`float`、`char`等)及其用途。 2. **变量与常量...
C语言指针练习填空和阅读程序题 本资源主要涵盖了C语言指针的相关知识点,包括指针的基本概念、指针运算、指针与数组的关系、指针与字符串的关系等。通过本资源的学习,可以帮助读者更好地理解和掌握C语言指针的...
指针是C语言中的一个基本概念,理解和掌握指针的使用是C语言编程的关键。本文将通过10个习题,详细解释指针的概念和使用方法,以帮助读者更好地掌握C语言指针的使用。 1. 指针变 flap 变量 a 的读入 在C语言中,...