内存信息的生成与交换

由C编译的程序占用内存情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\\0在常量区,p3在栈上.
static int c =0;//全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区.
strcpy(p1, "123456"); //123456\\0放在常量区,
// 编译器可能会将它与p3所指向的"123456"优化成一个地方.
char *s = "hello, world";
printf("%s\n",&s[7]);//world
}

如图

不能进行交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
/*
*void swap(int a, int b);
*/
void swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main(void)
{
/* main函数会分配一个内存空间 */
int x = 1;
int y = 2;
/* main函数中会为x,y分配两个紧邻的内存空间
* */
printf("x is %i\n", x);
printf("y is %i\n", y);
printf("Swapping...\n");
printf("Swapped.\n");
swap(x, y);
/* swap函数也会分配独立的内存空间,并且是在main内存空间之上
*/
printf("x is %i\n", x);
printf("y is %i\n", y);
}

成功交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
void swap(int *a, int *b);
int main(void)
{
int x = 1;
int y = 2;
printf("x is %i\n", x);
printf("y is %i\n", y);
printf("Swapping...\n");
swap(&x, &y);
/* &表示内存地址,提供的是内存地址值
* 这个传递的不是x,y本身,而是x,y的int型地址
* 使一个函数能够使用另一个函数的内存块 */
printf("Swapped!\n");
printf("x is %i\n", x);
printf("y is %i\n", y);
}
/* */
/* */
void swap(int *a, int *b)
/* 当有函数调用swap函数时,函数原型使用*号之后,
* a不再是一个整形数,而是一个int型指针,指的是内存地址本身的值*/
{
/* 但是在函数中,*意思是定位到这个内存地址指向的值
* swap函数起了作用 来修改本来不属于它的内存,
* 不在它的作用域的变量 */
int tmp = *a;
*a = *b;
*b = tmp;
/*但 = 左边的 表示内存地址的值 */
}
/*当这个函数调用完成之后swap内存空间将会被释放 */

如图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void)
{
printf("s: ");
/* 指针是操作内存地址的方法
stack栈 heap堆:为函数分配的内存地址(指针)
*/
string *s = get_string();
string *t = s;/*t为指针,s为具体的值*/
int *x;
int *y;
x = malloc(sizeof(int));/*内存分配:
表示向系统申请存在空间的字节数
已经有预定指向内存地址了*/
/* x = 52;会重新分配新内存,而上面的内存也就浪费掉了*/
*x = 52;
/* *y = 12; 这个没有事先分配的内存地址*/
y = x;
*y = 12;
}
Share Comments