当前位置: 首页 > news >正文

C语言:字符串存在哪?

文章目录

  • 0x1
  • 0x11 栈上(Stack)
  • 0x12 堆上(Heap)
  • 0x13 常量存储区(Constant)
  • 0x2
  • 0x21 常量区
  • 0x22 栈区

0x1

0x11 栈上(Stack)

局部变量(包括在函数内部定义的数组和变量)通常存储在栈上。
当你在函数内部定义一个字符数组并初始化一个字符串时,这个字符串就存储在栈上。

void function() {char str[] = "Hello, World!";// str 存储在栈上
}

0x12 堆上(Heap)

使用动态内存分配函数,如 malloc 或 calloc,分配的内存位于堆上。
如果你使用这些函数为字符串分配内存,字符串将存储在堆上。

char *str = malloc(20 * sizeof(char));
if (str != NULL) {strcpy(str, "Hello, World!");// str 存储在堆上
}

0x13 常量存储区(Constant)

使用字符串字面量(如 “Hello, World!”)通常存储在只读的数据段中,这个区域有时被称为常量存储区。
这些字符串是不可修改的,尝试修改它们将导致未定义行为。

char *str = "Hello, World!";
// 字符串字面量存储在常量存储区

0x2

0x21 常量区

#include <stdio.h>
char * func01(void) {char *s = "hell world";char buf[] = "hello world";return s;
}
int main(void) {char *p = func01();printf("char ptr is %s\n", p);
}

编译:
gcc -o demo demo.c
运行:
char ptr is hell world

0x22 栈区

#include <stdio.h>
char * func01(void) {char *s = "hell world";char buf[] = "hello world";return buf;
}
int main(void) {char *p = func01();printf("char ptr is %s\n", p);
}

编译:
gcc -o demo demo.c

demo.c: In function ‘func01’:
demo.c:7:15: warning: function returns address of local variable [-Wreturn-local-addr]7 |        return buf;

运行:
char ptr is (null)


http://www.mrgr.cn/news/16777.html

相关文章:

  • xxe漏洞
  • 【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)
  • 物联网架构之CDH详解
  • 基于SSM的咖啡馆管理系统
  • 【Godot4.3】MarkDown解析和生成类 - MDdoc
  • 【MyBatis】MyBatis的一级缓存和二级缓存简介
  • 29. 双耳配对
  • FastAPI+Vue3零基础开发ERP系统项目实战课 20240831上课笔记 路径参数
  • OCI编程高级篇(十五) 设置字段数据入口
  • 【Kubernetes知识点问答题】第二篇
  • 【电子数据取证】Linux软件包管理器yum和编辑器vim
  • 【408DS算法题】031基础-判断二叉树是否是平衡二叉树
  • linux文件——文件系统——学习、理解、应用软硬件链接
  • PyTorch 的自动求导与计算图
  • 猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测
  • 如何在windows中使用hfd.sh aria2c下载huggingface文件
  • 【函数模板】函数模板的重载
  • 操作系统的发展历程与分类
  • python --计算两个月份的差值
  • Datawhale X 李宏毅苹果书 AI夏令营|机器学习基础之线性模型