全局区
全局区分为:全局变量,静态变量,文字常量区
#include <stdio.h>
char * getstr() {
char * p = "hello world"; //文字常量区
return p;
}
char * getstr2() {
char * p = "hello world"; //文字常量区
return p;
}
int main() {
char * p = NULL;
char * q = NULL;
p = getstr();
// %s指针指向内存区域的内容 %d打印指针本身的值
printf("p = %s, p = %d\n", p , p); // p = hello world, p = 4210688
q = getstr2();
// %s指针指向内存区域的内容 %d打印指针本身的值
printf("q = %s, q = %d\n", q , q); // q = hello world, q = 4210688
/* 上面"hello world"保存在文字常量区,
getstr内部的p指针指向"hello world"地址,然后返回该地址给main函数里的p指针,所以此时p指针指向"hello world"的地址
getstr2内部的q指针指向"hello world"地址,然后返回该地址给main函数里的q指针,所以此时q指针指向"hello world"的地址 */
}
image.png
栈区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * getstr() {
char str[] = "abcdef";//栈区
return str;
}
int main() {
char buf[128] = {0};
strcpy(buf, getstr());
printf("buf = %s\n", buf); //乱码,不确定
return 0;
}
image.png
堆区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * getstr2() {
char * tmp = malloc(128);
if (tmp == NULL)
{
return NULL;
}
tmp = "abcdef";
return tmp;
}
int main() {
char * p = NULL;
p = getstr2();
if (p != NULL)
{
printf("p = %s\n", p);
free(p);
p = NULL;
}
return 0;
}
image.png
静态局部变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int * getA(){
static int a = 10; // a的地址在全局区,getA函数返回a的地址
return & a;
}
int main() {
int * p = getA();
printf("p = %d\n", *p);
return 0;
}
栈的生长方向
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int a = 10;
int b = 20;
// 地址递减
printf("&a = %d &b = %d\n", &a, &b); // &a = 6422044 &b = 6422040
int arr[10];
printf("arr = %d, arr+1 = %d\n", arr, arr+1); // arr = 6422000, arr+1 = 6422004
return 0;
}
网友评论