本人在学习记录,觉得有帮助的点个赞,谢谢谢谢谢谢。
1.全局区:
全局变量:在函数外部定义的变量。 |
静态变量:static修饰定义的变量。 |
常量:数字常量或者字符串常量,由#define 常量 常量数值,修饰的常量 |
例:
#include <stdio.h>
char * getStr1() { //定义可返回指针的数组
char *p1 = "abcde"; /*把字符串常量的地址为指针变量p1,相当于在外部声明#define a "abcde",把a的地址&a赋值给p1*/
return p1; //返回指针p1
}
char *getStr2() {
char *p2 = "abcde";
return p2;
}
int main(void) {
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1 p2 所指向内存空间的数据
printf("p1:%s , p2:%s \n", p1, p2); // /s:取出对应地址的值
//打印p1 p2 的值
printf("p1:%p , p2:%p \n", p1, p2);
return 0;
}
程序讲解:在不同的两个函数getStr1/getStr2中,定义了两个不同的指针变量p1/p2,最后返回的值和地址全部相同,是因为他们返回地址都指向了全局区的同一个地址(“abcde”是存放全局的去的常量)。
2.栈区:定义在函数内部的变量存放在栈区,进入函数则开辟,退出函数则释放。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char *get_1() {
char num[] = "abcde"; //定义字符串数组放在栈区
return num; //返回字符串数组首地址
}
void main() {
char *p = NULL;
p = get_1();
printf("%s\n",p); //将返回乱码
}
程序讲解:函数get_1中返回的地址内容是放在栈区的,当退出函数其空间将被释放,所以打印返回地址中的值是乱码。
3.堆区:由程序员自由分配-释放的动态内存,malloc(分配字节数),free(释放的空间)。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char *get_1() {
char *num = (char *)malloc(20); //分配空间为1*20字节空间放在堆区
if(num == NULL){
return NULL; //分配不成功则直接退出
}
strcpy(num,"abcde"); //将字符串放入开辟的堆区空间中
return num;
}
void main() {
char *p = NULL;
p = get_1(); //将堆区地址返回给p
if(p != NULL){ //判断是否分配成功
printf("释放前\n");
printf("%s\n",p);
free(p); //释放
printf("释放后\n");
printf("%s\n",p); //释放后打印的将是乱码
}
}
程序讲解:由于堆区是空间是分配后不释放将一直存在直到程序结束,所以释放前打印没问题,释放后将出现乱码。
4.程序区:众所周知程序区是用来存放程序的空间,是将函数体转化为二进制数存放进入程序区。
谢谢大家的观看,帮助的话留下一点足迹呦