c - 我们什么时候应该在 char 数组(char [])上使用 char 指针(char *)?
问题描述
是否存在一种类型优于另一种类型的情况?
我唯一能想到的是...
一个指针使用 4 个字节,而 char 数组的大小取决于字符串的长度,所以如果你有一个非常大的字符串,使用 char 指针代替以节省内存是有益的示例:如果你通过参数传递字符串。
但就字符串操作而言,哪个是首选?
例子:
char *hello_pointer = malloc(sizeof(char) * 20);
char hello_array[20];
strcat(hello_pointer, "hello pointer");
strcat(hello_array, "hello array");
在这种情况下,是否有优先于另一种的偏好?
解决方案
这不是关于“节省内存”,而是关于动态分配与固定长度缓冲区的对比。
在您的示例中,您假设您的数据不超过 19 个字符。这可能是一个巨大的错误。直到您想在声明的范围之外使用该数据之前,和之间的区别并不真正char* x
相关。char x[20]
char* x
分配的usingmalloc
将在函数范围之外持续存在。遗嘱不会,你需要char[20]
在它被回收之前复制它。
所以相比之下,像这样的缓冲区char x[20]
:
- 有效地零成本创建
- 必须保守地调整大小以避免消耗过多的堆栈空间
- 声明时需要 NUL 终止,例如
char x[20] = { 0 }
- 一旦超出功能范围就不能使用
鉴于char* x
:
- 初始化成本很小
free
不再使用时必须释放,否则程序将泄漏内存- 可以在函数范围之外使用
- 使用前必须初始化,可能包含垃圾数据
您有100% 的责任:
- 正确初始化字符缓冲区
- 确保缓冲区的大小适合您打算存储在其中的数据
- 通知任何操作这个缓冲区的函数缓冲区的大小是多少,或者在某些情况下,剩余的大小是多少
- NUL 终止您操作的任何缓冲区,您可能会覆盖终止符
- 释放任何动态分配的内存
通常,您会看到固定长度的缓冲区用于诸如读入和解析文件之类的事情,在这种情况下您会仔细执行此操作,并了解缓冲区的大小限制。带有长度参数的读取函数是您想要使用的函数,即使gets()
通常显示一些类似的函数。这些可以而且将会产生巨大的缓冲区溢出错误。
在 C++ 中,很容易避免这种混乱,只需使用std::string
which 自动为您处理所有这些。
推荐阅读
- mysql - SQL Server Reporting Services 未从 SQL 存储过程传递正确的参数
- python - 使用正则表达式拆分项目列表
- android - 如何知道 Speech To Text 何时完成?
- javascript - 你如何追加并让项目向上移动
- go - 包内组织的数据库层
- algorithm - Efficiently finding a path in a matrix whose elements sum to a target number?
- node.js - 无法使用节点 js 从 SFTP 下载大文件
- angular - Reactiv 表单中的自定义验证器不返回 true
- r - 为什么保存 lmer 图在 for 循环中不起作用
- python-3.x - 此内容是使用 selenium 和 python 下载 PDF。我无法从新生成的选项卡中获取 url