内存四区——全局区分析

 测试源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_str1()
{
	char *p = "AABBCCDDEEFF"; //文字常量区

	return p;
}

char *get_str2()
{
	char *q = "AABBCCDDEEFF"; //文字常量区

	return q;
}

int main(void)
{
	char *p = NULL;
	char *q = NULL;

	p = get_str1();
	//%s: 指针指向内存区域的内容
	//%d: 打印p本身的值
	printf("p = %s, p = %d", p, p);
	
	puts("");

	q = get_str2();
	printf("q = %s, q = %d", q, q);

	printf("\n");
	system("pause");
	return 0;
}

测试结果:

代码分析: 

               实际上,"AABBCCDDEEFF"在全局区只有一份,所以导致最后打印的地址是一样的,而且这块区域会在整个程序的结束才会释放。

        如果将其中的一个字符串常量改变,使两个字符串常量不再相同,那个两个指针将指向不同的区域,简单的测试代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_str1()
{
	char *p = "AABBCCDDEEFF"; //文字常量区

	return p;
}

char *get_str2()
{
	char *q = "AABBCCDDEEFF1"; //文字常量区

	return q;
}

int main(void)
{
	char *p = NULL;
	char *q = NULL;

	p = get_str1();
	//%s: 指针指向内存区域的内容
	//%d: 打印p本身的值
	printf("p = %s, p = %d", p, p);
	
	puts("");

	q = get_str2();
	printf("q = %s, q = %d", q, q);

	printf("\n");
	system("pause");
	return 0;
}

测试结果如下:

猜你喜欢

转载自blog.csdn.net/zxy131072/article/details/88363216