【问题标题】:When should we use a char pointer ( char *) over a char array (char [] )? [duplicate]我们什么时候应该在 char 数组(char [])上使用 char 指针(char *)? [复制]
【发布时间】:2020-04-21 21:41:34
【问题描述】:

是否存在一种类型优于另一种类型的情况?

我唯一能想到的就是……

一个指针使用 4 个字节,一个 char 数组的大小取决于字符串的长度,所以如果你有一个非常大的字符串,使用 char 指针代替以节省内存是有益的例子:如果你传递字符串通过参数。

但是在字符串操作方面,哪个是首选?

示例:

char *hello_pointer = malloc(sizeof(char) * 20);
char hello_array[20];

strcat(hello_pointer, "hello pointer");
strcat(hello_array, "hello array");

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

【问题讨论】:

  • 更喜欢使用std::string
  • 这完全取决于你在做什么。在这里,无论哪种方式,您都缺少一些东西,因为您正在与未初始化的字符串连接。
  • 在 2012 年以来制造的任何计算机上,指针都是 8 个字节,但这并不重要,因为同一台计算机肯定有几 GB 的内存。
  • 请选择 C ​​或 C++。它们是不同的语言,最佳答案可能取决于您实际使用的语言。

标签: c arrays pointers malloc


【解决方案1】:

不同之处在于malloc()new 将在堆上分配内存,这会更慢并且不会在作用域结束时被破坏。 char hello_array[20] 将在堆栈上分配,并随堆栈帧一起被删除。

另外,使用malloc(sizeof(char) * 20),您不只是分配一个指针,而是分配内存块来处理 20 个字符。大小将相同。

【讨论】:

  • 我现在明白了。谢谢:)
【解决方案2】:

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

在您的示例中,您假设您的数据将不超过 19 个字符。这可能是一个巨大的错误。 char* xchar x[20] 之间的区别并不真正相关,除非您想在声明的范围之外使用该数据。

使用malloc 分配的char* x 将在函数范围之外持续存在。 char[20] 不会,你需要在它被回收之前复制它。

所以相比之下,像char x[20]这样的缓冲区:

  • 实际上是零成本的创建
  • 大小必须保守,以避免占用过多的堆栈空间
  • 在声明时需要以 NUL 终止,例如 char x[20] = { 0 }
  • 不能一旦超出功能范围就不能使用

char* x:

  • 初始化成本很小
  • 在不再使用时必须使用free 释放,否则程序会泄漏内存
  • 可以在函数范围之外使用
  • 使用前必须初始化,可能包含垃圾数据

100% 负责

  • 正确初始化字符缓冲区
  • 确保缓冲区的大小适合您打算存储在其中的数据
  • 通知任何操作此缓冲区的函数缓冲区的大小,或者在某些情况下,剩余大小是多少
  • NUL 终止您操作的任何缓冲区,您可能会覆盖终止符
  • 释放任何动态分配的内存

通常,您会看到固定长度的缓冲区用于诸如读入和解析文件之类的事情,在这种情况下,您会仔细执行此操作并了解缓冲区的大小限制。即使有一些像gets() 这样通常显示的函数,也可以使用带有长度参数的读取函数。这些可以而且将会产生巨大的缓冲区溢出错误。

在 C++ 中,很容易避免这种混乱,只需使用 std::string 即可自动为您处理所有这些问题。

【讨论】:

  • 我明白了。所以它的使用真的取决于你需要的范围吗?
  • 没错。如果您暂时需要它,请使用数组,因为这些基本上是零成本。如果你想要更长的时间,动态的。例外:如果您需要一个非平凡大小的缓冲区(例如超过 1024 字节),请使用动态分配,因为堆栈空间是有限的。
  • 知道了。谢谢!
猜你喜欢
  • 2021-01-26
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多