var1必须包含一个字符串,无论它是否为空,否则我的程序将是段错误的。但是gcc抱怨空字符串文字是常量而var1不是。以下是我所说的一个例子。
我该如何解决这个问题?
警告:赋值会从指针目标类型
中丢弃限定符
char *var1 = NULL;
if(var1 == NULL)
{
var1 = malloc(strlen(var2) + 1);
strcpy(var1, var2);
}else{
var1 = ""; // warning points here
}
修改
字符串文字不可修改,因此我使用此标志警告我:
-Wwrite串
答案 0 :(得分:2)
要分配空字符串,请执行以下操作:
var1 = malloc(1); /* 1 byte */
var1[0] = '\0';
答案 1 :(得分:2)
字符串文字的类型为char[]
。在大多数上下文中使用时,字符串文字(类型为char[]
)会衰减到指向其第一个元素的指针(它变为类型char*
)。
如果您的编译器抱怨将类型char*
(您的""
)的值分配给char*
类型的对象(您的var1
),那么您的编译器已经坏了。
或者,很可能,您不是将它作为“C”编译器调用,而是作为类似于C但不完全是C的语言的编译器。
尝试:gcc -Wno-write-strings ...
禁用该特定的gcc扩展名: - )
修改强>
字符串文字是一个字符数组(类型为char[]
),但它不可修改。对于历史(或其他一些特殊的)原因,它们不属于const char[]
类型,因为“不可修改的字符数组”看起来应该是这样。
使用“-Wwrite-strings”编译器选项,gcc尝试提供帮助并更改其字符串文字的定义。
如果您想要安全并且您的字符串文字属于const char[]
类型,请记住您不再编译C(C89,C90,C99,无论如何)并且感到高兴。正如其他答案所说:将指针声明为const
或将不可修改的字符复制到可修改的对象。
答案 2 :(得分:0)
将var1声明为常量:
const char *var1 = NULL;
const表示你不会改变指向的东西的内容(所以,例如,你不会尝试改变字符串文字的内容)。您仍可以自由更改变量指向的内容。
答案 3 :(得分:-1)
字符串文字在最新版本的C中具有类型const char *(或者可能是const char [])。将字符串文字分配给char *是不安全的,因为修改char *会导致未定义的行为,反映在它们的const中类型。