内存四区——全局区分析
测试源码:
#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;
}
测试结果如下: