首页 > 解决方案 > 我们什么时候应该在 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");

在这种情况下,是否有优先于另一种的偏好?

标签: carrayspointersmalloc

解决方案


这不是关于“节省内存”,而是关于动态分配与固定长度缓冲区的对比。

在您的示例中,您假设您的数据不超过 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::stringwhich 自动为您处理所有这些。


推荐阅读