浅谈C内存分配2
内存分配方式有三种:
(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)语句不起作用。
******************
相关文档:
B/S结构,即Browser/Server(浏览器/服务器
)结构,是随着
Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是
主要事务逻辑在服务器
端实现,形成所谓
3-tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的 ......
通用函数库在头文件stdlib.h中声明,比较庞大,主要分为以下几大类:存储分配、随机数生成、数字转换与整型运算、程序退出与环境通信、搜索与排序、多字节与宽字符的转换。由于汲及到存储分配、环境通信等,因此它们的大多数也依赖于操作系统。glibc中,通用函数库的核心实现在stdlib和malloc两个目录下 ......
函数 - 声明、定义、调用
1. 如果函数没有声明, 应该在调用前定义:
#include <stdio.h>
/* 定义求大值函数 */
int MAX(int x, int y) {
if (x > y)
return x;
else
return y;
}
/* 定义求小值函数 */
int MIN(int x, int y) {
return x &l ......
/加了下面两个头文件,是为了在Win32工程中使用MFC的特性!
#include <afx.h>
#include <afxwin.h>
#include "stdio.h"
#include "conio.h"
////加了下面两句,是为了能够用string(basic_string类型)
#include <string>
using namespace std;
int main(int argc, char* argv[ ......