C:如何正确声明一个字符串数组?

kiz8lqtg  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(100)

我看到了两者:

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"};
ax6ht2ek

ax6ht2ek1#

这是不正确的,因为它没有正确的间接级别。

const char* arr = {"foo", "bar"};

这是不正确的,因为它缺少一个=。它看起来有点像函数定义。

const char* arr[] {"foo", "bar"};

这是通常的正确形式。

const char* arr[] = { "foo", "bar" };

编辑

你不能从聚合初始化器初始化一个指针(即{ ...,...,...})。你可以两者兼得

const char* str1 = "A string";

const char str2[] = "Another string";

但这次不一样
一个字符串字面量的类型是'array of n char',所以可以转换为指针,而初始化列表实际上不是一个数组,它只是一种初始化数组的方法。

vyu0f0g1

vyu0f0g12#

关于constance…

const char* constValue = "foo";
constValue = "bar";
constValue[0] = 'x'; // will not work

char* const constPtr = "foo";
constPtr = "bar"; // will not work
constPtr[0] = 'x';

const char* const arr[] = { "foo", "bar", 0 }; // all const

'const char* const'通常是完全常数的最佳解决方案。另一个优化是,如果在局部作用域中声明,则也将其设置为静态。0 ptr对于sentinel值很有用。

cqoc49vn

cqoc49vn3#

有几种方法。最简单的是声明一个char数组的数组,像这样:

char strs[N][M + 1]; // M is max length of each string
...
strcpy(strs[i], "foo");

字符串的所有内存都是静态分配的,但数组中每个字符串的大小是固定的,您必须根据可能的最长字符串来调整大小,这可能会导致一些内部碎片。所有字符串都是可写的。
另一种方法是声明一个指向char的指针数组:

char *strs[N];
...
strs[i] = malloc(strlen("bar") + 1);
if (strs[i]) 
  strcpy(strs[i], "bar");

通过这种方式,您可以根据数组中每个字符串所需的大小分配内存,并且可以在必要时调整字符串的大小。你也可以只指向字符串文字,但是记住文字可能是不可写的;也就是说,您可能无法执行以下操作:

strs[j] = "foo";
strs[j][0] = 'b'; // may not be allowed on string literal

您可以动态分配整个smash:

char **strs = malloc(sizeof *strs * N);
for (i = 0; i < N; i++)
  strs[i] = malloc(SIZE + 1);

这种方法不仅允许您根据需要调整每个字符串的大小,还允许您调整字符串的数量。注意,在这种情况下,strs * 不是 * 数组类型,即使它被视为数组。
注意,关于malloc()的最佳实践在C和C++之间是不同的。在C语言中,强制转换malloc()的结果被认为是不好的做法。首先,它是不必要的,因为空指针被隐式转换为其他对象指针类型。另一方面,如果您忘记#include stdlib. h或在作用域中没有malloc()的原型,它将禁止诊断。请记住,如果C在引用函数之前没有看到函数的原型,它将假定该函数返回int,而int不能隐式转换为指针类型。

n3schb8v

n3schb8v4#

通常,如果可能的话,我在这里使用动态内存。我发现考虑指针比与数组类型斗争更简单。

//Allocate pointers for the strings
char **c = (char**)malloc(maxnumofstrs*sizeof(int));
//allocate memory for each string
for(int i = 0; i < maxnumofstrs; i++)
{
   c[i] = (char*)malloc(maxwidth);
}

相关问题