全局初始化char数据的2D数组指针

时间:2010-08-26 02:50:35

标签: c arrays string

我有一个指向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, ...},    

    {...}

};

我认为langlangPtr都指向字符串的开头,所以应该能够做到这一点。我想使用指针初始化2D数组。无论如何全球都这样做了吗?

2 个答案:

答案 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文件中定义(即初始化)变量。

祝你好运。