C语言变量分配:栈 vs 堆详解(带字符串和结构体示例)
在C语言中,变量的存储可以分为两种方式:栈和堆。
栈是一个LIFO(Last In First Out)数据结构,它的生命周期由程序控制。当一个函数被调用时,该函数的局部变量就被分配在栈上。当函数返回时,这些变量就会被自动释放。因此,栈上的变量是临时的,它们的生命周期只存在于函数的执行期间。
而堆是由程序员手动分配和释放的一块内存区域。在堆上分配的变量生命周期不受函数调用的限制,它们可以在程序的任何地方被访问,直到被程序员显式地释放。
下面以字符串和结构体为例,说明C语言中分配在堆上和栈上的情况。
- 字符串的分配
字符串是一种常用的数据类型,通常使用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;
}
- 结构体的分配
结构体是一种用户自定义的数据类型,它可以包含多个不同的数据类型。在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;
}
原文地址: https://www.cveoy.top/t/topic/n1Sb 著作权归作者所有。请勿转载和采集!