故障声明串的全局阵列在C

问题描述:

下面的代码,在全球范围内,不编译:故障声明串的全局阵列在C

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

错误消息是“初始元件不恒定” - 这我惊讶,因为变量一个和两个都被声明为常量。制作编号const不能解决问题。用字符串文字声明数字(char *nums[2] = {"1", "2"};确实解决了这个问题,但出于可读性的原因,我宁愿不以这种方式在我的实际代码中这样做。

有没有一个体面的方式来得到这个工作?

+0

'constant'并不意味着'const',这意味着文字,像' “喇嘛喇嘛”' – Shahbaz

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

目前,one可变指针,所以它不可能被认为是一个常量表达式,但即使是更正确const char * const one = "1";中C.不会做(这将会在C++细。)

你不得不说:

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

请注意,C中的'const'并不真正意味着“常量”;它表示只读。如果你为一个数组提供一个初始值设定项,你不需要指定长度:'const char * nums [] = {“1”,“2”};' –

+0

@KeithThompson:Thanks,“read-only”想一想'const'的好方法! –

+0

如果你想要单独的命名字符串和数组,你可以写'char const * const one = nums [0];' –

你可以尝试#define荷兰国际集团的常数代替

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

哦,好主意。谢谢。 – GMB

+2

第三行的'const'仍然是一个非常好的主意,因为指针指向只读内存。 –

+0

你所描述的问题是不能保证'ONE == ONE'。 –

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

这里无论是指定const限定符,one和two都是字符串const。 我的意思是char *one = "1";与常规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); 
}