我看到了两者:
const char* arr = {"foo", "bar"};
和
const char* arr[] = {"foo", "bar"};
什么是正确的和普遍的标准方法?
两者有什么区别?
有什么区别
const char**arr = {"foo", "bar"};
和
const char* arr[] = {"foo", "bar"};
和
const char* * const arr = {"foo", "bar"};
和
const char* const * const arr = {"foo", "bar"};
4条答案
按热度按时间ax6ht2ek1#
这是不正确的,因为它没有正确的间接级别。
这是不正确的,因为它缺少一个
=
。它看起来有点像函数定义。这是通常的正确形式。
编辑
你不能从聚合初始化器初始化一个指针(即{ ...,...,...})。你可以两者兼得
和
但这次不一样
一个字符串字面量的类型是'array of n char',所以可以转换为指针,而初始化列表实际上不是一个数组,它只是一种初始化数组的方法。
vyu0f0g12#
关于constance…
'const char* const'通常是完全常数的最佳解决方案。另一个优化是,如果在局部作用域中声明,则也将其设置为静态。0 ptr对于sentinel值很有用。
cqoc49vn3#
有几种方法。最简单的是声明一个char数组的数组,像这样:
字符串的所有内存都是静态分配的,但数组中每个字符串的大小是固定的,您必须根据可能的最长字符串来调整大小,这可能会导致一些内部碎片。所有字符串都是可写的。
另一种方法是声明一个指向char的指针数组:
通过这种方式,您可以根据数组中每个字符串所需的大小分配内存,并且可以在必要时调整字符串的大小。你也可以只指向字符串文字,但是记住文字可能是不可写的;也就是说,您可能无法执行以下操作:
您可以动态分配整个smash:
这种方法不仅允许您根据需要调整每个字符串的大小,还允许您调整字符串的数量。注意,在这种情况下,strs * 不是 * 数组类型,即使它被视为数组。
注意,关于malloc()的最佳实践在C和C++之间是不同的。在C语言中,强制转换malloc()的结果被认为是不好的做法。首先,它是不必要的,因为空指针被隐式转换为其他对象指针类型。另一方面,如果您忘记#include stdlib. h或在作用域中没有malloc()的原型,它将禁止诊断。请记住,如果C在引用函数之前没有看到函数的原型,它将假定该函数返回int,而int不能隐式转换为指针类型。
n3schb8v4#
通常,如果可能的话,我在这里使用动态内存。我发现考虑指针比与数组类型斗争更简单。