//动态区域分配内存
#include<iostream>
using namespace std;
char *strA()
{
char *str = "hello world";
cout << "str= " << str << endl;
cout << "&str= " << &str << endl;
return str;
}
void GetMemory(char **p,int num)
{
*p=(char *) malloc(sizeof((char *)num));
}
int main()
{
char *str = NULL;
GetMemory(&str, 100);
str = strA();
//p = strA();
cout<< "str= " << str << endl;
return 0;
}
这是在动态区域中分配内存:char *str = NULL;这只是声明了一个指针,并没有给指针分配地址,也就是说如果想用这个指针,必需给它分配内存,(一般常用的方法是在声明的时候就给指针分配内存),调用GetMemory()给指针分配内存,这里的*p=(char *) malloc(sizeof((char *)num));在堆中给str分配一定大小的空间。
str = strA();是把函数strA()返回的地址给str,这样就出现问题了,那么刚才GetMemory()给指针分配内存就没有用到,str直接指向函数strA()返回的地址。怎么改正这个问题?
//动态区域分配内存
#include<iostream>
using namespace std;
char *strA()
{
char *str = "hello world";
cout << "str= " << str << endl;
cout << "&str= " << &str << endl;
return str;
}
//void GetMemory(char **p,int num)
//{
// *p=(char *) malloc(sizeof((char *)num));
//}
int main()
{
char *str = strA();
// GetMemory(&str, 100);
// str = strA();
//p = strA();
cout<< "str= " << str << endl;
return 0;
}
2.如何在静态存储区内分配内存
//如何在静态区域分配内存
#include<iostream>
using namespace std;
const char *strA()
{
char *str = "hello world";
cout << "str= " << str << endl;
cout << "&str= " << &str << endl;
return str;
}
//void GetMemory(const char **p,int num)
//{
// *p=(char *) malloc(sizeof((char *)num));
//}
int main()
{
const char *str = strA();
// GetMemory(&str, 100);
// str = strA();
//p = strA();
cout<< "str= " << str << endl;
return 0;
}
这段代码不知能否在静态存储区内分配内存,字符串hello world分配在那个区域?
分享到:
相关推荐
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 文字常量区 —...
C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,...
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方...
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...
一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:...
一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用...
变量可以分为全局变量、静态全局变量、静态局部变量和局部变量 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分:全局变量在整个工程文件内都...
一、预备知识―程序的内存分配 一个由 c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 2、堆区...
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字...
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
动态内存分配 (1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其...
1:指针:是一个变量,可以存储...静态分配的变量在main之前分配内存和初始化变量,只到程序终止才释放内存。每次调用函数不会重新初始化。 5:动态分配:在程序运行期间为变量分配内存空间。其中包括栈分配和堆分配。
全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放文字常量区—常量...
本题考查动态重定位和静态重定位在作业运作过程中发生的时间。 静态重定位由操作系统中的重定位装入程序来完成。用户作业的相对于“*0” 编址的目标程序,是重定位装入程序的输入。重定位装入程序按照分配区域的起 ...
知道如上一些内存分配机制,有助于我们理解指针的概念。C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。全局变量、...
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
C内存分配区域 程序代码区 存放函数体的二进制代码 全局数据区 全局变量和静态变量的存储是放在一起的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量...
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区...
便笺Rust库提供具有双端分配支持的类似堆栈的内存分配器。注意: scratchpad目前处于维护模式。 我一直在考虑进行大型清理,以消除多余的功能并减少unsafe代码的表面积,但是目前尚无时间表。 我仍然会根据需要应用...