我看到了两个:
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"};
很抱歉这么多问题,只是想更好地理解它......
答案 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);
}