我有一个指向char的二维数组指针,并在头文件中初始化它。
问题是:它不会抱怨被分配const char[]
但不喜欢我分配const char*
(如代码所示)。它给我一个错误“初始化元素不是常数”。
const char lang[8] = "English";
const char * langPtr = "English 1";
const char * optionPtr[3][10] = {
{lang, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
{langPtr, 0, ...},
{...}
};
我认为lang
和langPtr
都指向字符串的开头,所以应该能够做到这一点。我想使用指针初始化2D数组。无论如何全球都这样做了吗?
答案 0 :(得分:2)
在C中,静态对象的初始化器中的元素必须是“常量表达式”(所有全局对象都是静态的)。
静态对象的地址是“地址常量”,这是一种“常量表达式” - 这就是lang
工作的原因。变量的值 - 即使是const
变量(虽然注意langPtr
本身不是const
) - 不是“常量表达式”,这是为什么langPtr
不起作用。
请注意,这在C ++中是不同的,其中const
限定变量是真正的常量。
答案 1 :(得分:0)
* langPtr是字符'E',而不是指向该字符的指针。
编辑:哎呀问题已经改变,你现在正在使用langPtr而不是* langPtr。我会再看看。
嗯。对不起我应该提供评论而不是答案,但是我已经开始给出答案了,我会继续。
有趣的是,你的代码在C ++中编译得很好而不是C,我们可以把它作为一个指示,问题是一个微妙的。
编译器的错误消息确实是正确的。标识符langPtr是一个不是常量的变量,因为你可以将langPtr改为指向其他const char。
一种解决方法是替换字符串文字“英语1”而不是在数组中使用langPtr。同样的解决方法表示略有不同,是使用预处理器来定义langPtr,所以;
#define langPtr "English 1"
不可否认,这很难看,但也许它会满足你的需求。
最后,我建议不要初始化头文件中的任何数组。在头文件中声明变量。在.c文件中定义(即初始化)变量。
祝你好运。