char * to string literal?

时间:2010-10-17 15:57:09

标签: c gcc

var1必须包含一个字符串,无论它是否为空,否则我的程序将是段错误的。但是gcc抱怨空字符串文字是常量而var1不是。以下是我所说的一个例子。

我该如何解决这个问题?

  

警告:赋值会从指针目标类型

中丢弃限定符
char *var1 = NULL;
if(var1 == NULL)
{
    var1 = malloc(strlen(var2) + 1);
    strcpy(var1, var2);
}else{
    var1 = ""; // warning points here
}

修改

字符串文字不可修改,因此我使用此标志警告我:

-Wwrite串

4 个答案:

答案 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中类型。