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

时间:2009-07-29 14:30:18

标签: c

我看到了两个:

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 个答案:

答案 0 :(得分:12)

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

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

但这是不同的。

字符串文字的类型为'n of char',因此可以转换为指针,而初始化列表实际上不是数组,它只是一种初始化数组的方法。

答案 1 :(得分:3)

关于常数......

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对于标记值很有用。

答案 2 :(得分:1)

有几种方法。最简单的是声明一个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

你可以动态分配整个粉碎:

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

此方法不仅可以根据需要调整每个字符串的大小,还可以调整字符串数量。请注意,在这种情况下,strs 是一种数组类型,即使它被视为一个数组。

请注意,关于malloc()的最佳实践在C和C ++之间有所不同。在C中,转换malloc()的结果被认为是不好的做法。首先,它是不必要的,因为void指针被隐式地转换为其他对象指针类型。另一方面,如果您忘记#include stdlib.h或者在范围内没有malloc()的原型,它将会抑制诊断。请记住,如果C在引用函数之前没有看到函数的原型,它将假定函数返回int,它不能隐式转换为指针类型。

答案 3 :(得分:0)

通常情况下,如果可能,我会使用动态内存。我发现考虑指针比使用数组类型更容易。

//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);
}