在C语言中,变量的存储可以分为两种方式:栈和堆。

栈是一个LIFO(Last In First Out)数据结构,它的生命周期由程序控制。当一个函数被调用时,该函数的局部变量就被分配在栈上。当函数返回时,这些变量就会被自动释放。因此,栈上的变量是临时的,它们的生命周期只存在于函数的执行期间。

而堆是由程序员手动分配和释放的一块内存区域。在堆上分配的变量生命周期不受函数调用的限制,它们可以在程序的任何地方被访问,直到被程序员显式地释放。

下面以字符串和结构体为例,说明C语言中分配在堆上和栈上的情况。

  1. 字符串的分配

字符串是一种常用的数据类型,通常使用char数组来表示。在C语言中,字符串可以被分配在栈上或堆上,具体取决于它的声明方式。

如果使用'char str[] = "hello";'的方式声明字符串,它将被分配在栈上。这是因为它是一个局部变量,它的生命周期受到函数调用的限制。

如果使用'char *str = "hello";'的方式声明字符串,它将被分配在静态存储区,也就是常量区。这是因为字符串常量是只读的,它们不能被修改,因此它们被放在常量区。

如果使用malloc函数分配内存来存储字符串,它将被分配在堆上。这是因为malloc函数分配的内存是动态分配的,它的生命周期不受函数调用的限制。

下面是一个在堆上分配字符串的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *str = (char*)malloc(sizeof(char)*6);  // 在堆上分配6个字符的内存
    strcpy(str, "hello");  // 将'hello'复制到str所指向的内存中
    printf("%s\n", str);  // 输出字符串
    free(str);  // 释放内存
    return 0;
}
  1. 结构体的分配

结构体是一种用户自定义的数据类型,它可以包含多个不同的数据类型。在C语言中,结构体可以被分配在栈上或堆上,具体取决于它的声明方式。

如果在函数中声明结构体变量,它将被分配在栈上。这是因为它是一个局部变量,它的生命周期受到函数调用的限制。

如果使用malloc函数分配内存来存储结构体变量,它将被分配在堆上。这是因为malloc函数分配的内存是动态分配的,它的生命周期不受函数调用的限制。

下面是一个在堆上分配结构体的例子:

#include <stdio.h>
#include <stdlib.h>

struct student {
    char name[20];
    int age;
};

int main()
{
    struct student *p = (struct student*)malloc(sizeof(struct student));  // 在堆上分配结构体内存
    strcpy(p->name, "Tom");  // 将字符串'Tom'复制到结构体内存中
    p->age = 18;
    printf("Name: %s\nAge: %d\n", p->name, p->age);  // 输出结构体内容
    free(p);  // 释放内存
    return 0;
}
C语言变量分配:栈 vs 堆详解(带字符串和结构体示例)

原文地址: https://www.cveoy.top/t/topic/n1Sb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录