忽略点十七:指针空间补充与堆内存保存函数中的值
关于之前讲解就不再重复,点➡️ 点我 跳转
补充1:
除了之前讲的malloc和calloc外,还有一个特别重要的函数——realloc(),具体格式如下:
void* realloc (void* ptr, size_t size);
realloc可以将已分配的堆内存扩充到size的大小,并返回扩充后的内存起始地址(注意!当第一个参数所指向的内存空间不够扩大到size时,realloc将会重新分配一段足够大的内存空间,将旧内存空间中的内容拷贝到新地址并释放旧内存空间)
补充2:
易错点:对于下面代码,会输出什么?
char* test = "test";
test[0] = 'j';
printf("%s\n", test);
既不是"test",也不是"jest",也不是"j", 由于"test"存在内存的常量区,因此不能修改
补充3:
由于函数执行完毕后会释放掉函数所占用的栈内存,所以在函数中定义的东西就会随栈内存的释放而消失。那么,我们怎么样才能保存函数中一些有用的信息呢?
我暂时就想到以下3种方法,欢迎大佬们补充:
——利用返回值:
我们可以利用返回值把函数中的某一个值传入到main函数中,如果有多个值,我们也可以专门定义一个结构体,把多个值放到结构体中,返回该结构体(如果你们不嫌麻烦的话)例如:
struct node {
char name[10];
int age;
char address[15];
};
node fun() {
node t;
int age = 12;
char name[10] = "Ivan";
char address[15] = "Shan Dong";
t.age = age;
strcpy(t.name, name);
strcat(t.address, address);
return t;
}
int main() {
node k = fun();
printf("%s\n", k.name);
}
——利用静态变量
我们可以在函数中声明该变量为静态变量,这样变量就不会随着函数的结束而消失,而是直到整个程序结束后才会释放。但是声明静态变量有个局限性,就是该变量的作用域!!在函数内定义的静态变量,它虽然不会随着函数的消失而消失,但它只能作用于函数中!!例如:
void fun() {
static int a = 0;
a ++;
printf("%d\n", a);
}
int main() {
fun(); //此时a输出1
fun(); //此时a输出2 表明上次fun函数释放后a的值保存了下来
}
——创建堆内存存储并返回指向堆内存空间的指针
感觉这是最好的解决办法了,专门声明一块堆内存空间,然后把函数中想保存的东西存到里面,然后返回指向该内存空间的指针。这样就不会随函数的消失而消失,而且无论什么情况下都可通过指针去调用。例如:
int* fun() {
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)malloc(5 * sizeof(int));
for (int i = 0; i < 5; i ++) {
p[i] = a[i];
}
return p;
}
int main() {
int *k = fun();
for (int i = 0; i < 5; i ++) {
printf("%d ", k[i]); //输出为1 2 3 4 5
}
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!