C语言查缺补漏(十七)指针空间补充与堆内存保存函数中的值

忽略点十七:指针空间补充与堆内存保存函数中的值

​ 关于之前讲解就不再重复,点➡️ 点我 跳转

补充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
    }
}

​ ​

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/82960626