麻烦在c中声明全局字符串数组

时间:2011-11-16 23:35:22

标签: c arrays string global

以下代码在全局范围内无法编译:

const char *one = "1";
const char *two = "2";
char *nums[2] = {one, two};

错误消息是“初始化元素不是常量” - 这让我感到惊讶,因为变量1和2都被声明为常量。制作代号const并不能解决问题。使用字符串文字声明nums(char *nums[2] = {"1", "2"};可以解决问题,但出于可读性的原因,我不想在实际代码中这样做。

有没有一种可行的方法让这个工作?

3 个答案:

答案 0 :(得分:4)

C不允许变量进行全局初始化,即使这些变量本身是const。与C ++相比,C有一个更为严格的“常量表达”概念。

目前,one是一个可变指针,因此它不可能被视为一个常量表达式,但即使更正确的const char * const one = "1";也不能用C表示。 (在C ++中没问题。)

你必须说:

const char * nums[2] = { "1", "2" };

答案 1 :(得分:1)

你可以试试#define你的常数

#define ONE "1"
#define TWO "2"
/* const */ char *nums[2] = {ONE, TWO};

答案 2 :(得分:0)

const char *one = "1";
const char *two = "2";

这里一个和两个都是字符串const,而不管指定const限定符。 我的意思是char *one = "1";与const char *one = "1"相同。 在C字符串中const通过在声明期间定义来初始化,并且在程序执行期间保持不变。

char *nums[2];是一个char指针数组,可以通过两种方式使用。

第一种方式:

const char *one = "1";
const char *two = "2";
char *num[2] = {"1","2"}; // this is same as creating array of string const

第二种方式:

const char *one = "1";
const char *two = "2";

main()
{
   int len1 = strlen(one)+1;
   int len2 = strlen(two)+1;
   nums[0] = (char *)malloc(len1);
   nums[1] = (char *)malloc(len2);
   strcpy(nums[0],one);
   strcpy(nums[1],two);
}