内存分配的实例分析

//实例1

1
2
3
4
5
6
7
8
9
10
11
12
13
int a = 0; //全局初始化区  
char *p1; //全局未初始化区(C++中则初始化为NULL)
int main() {
int b; //b分配在栈上,整型
char s[] = "abc"; //s分配在栈上,char *类型;"abc\0"分配在栈上,运行时赋值,函数结束销毁
char *p2; //p2分配在栈上,未初始化
char *p3 = "123456"; //p3指向"123456"分配在字符串常量存储区的地址,编译时确定 p3存储在栈上
static int c = 0; //c在全局(静态)初始化区,可以多次跨函数调用而保持原值
p1 = (char *)malloc(10); //p1在全局未初始化区,指向分配得来得10字节的堆区地址
p2 = (char *)malloc(20); //p2指向分配得来得20字节的堆区地址
strcpy(p1, "123456"); //"123456"放在字符串常量存储区,编译器可能会将它与p3所指向的"123456"优化成一块
return 0;
}

//实例2(找bug)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main(){
char a[] = "hello";
//a分配在栈上,char* 类型,“hellp\0”分配在栈上,运行时赋值,程序结束时销毁。
a[0] = 'X';
cout << a << endl;
char *p = "world";
//p分配在栈上,char* 类型,“world\0”存于常量存储区(常量字符串),编译时p存入栈里。
p[0] = 'X';
cout << p << endl;
return 0;
}

其中字符数组a的容量是6,内容是“hello\0”,a的内容是可变的,而p分配在栈上,指向的地址在常量存储区,不可修改,因此修改p的时候会出现非法内存访问。

本文标题:内存分配的实例分析

文章作者:Tokey

发布时间:2019年03月19日 - 21:03

最后更新:2021年06月29日 - 22:06

原始链接:http://TokeyRoad.github.io/2019/03/19/内存分配的实例分析/

许可协议: 转载请保留原文链接及作者。

0%