C中的警告:赋值在没有强制转换的情况下从指针生成整数

时间:2013-05-19 08:32:26

标签: c casting

编译程序时,我一直收到此错误消息。这只是我代码的一小部分,因此如果需要,我将提供其余的代码。有关为何发生这种情况的任何想法?

void strip_quotes(char s[]) {
   if (s[0]=='"') s=s+1;
   if (s[strlen(s)-2]=='"') s[strlen(s)-2]=NULL;
}

4 个答案:

答案 0 :(得分:6)

您要将s的字符设置为NULL。向字符串添加空字符的正确方法是使用'\0'

要解释该消息,NULL可能定义为(void*)0,因此在您指定时,您正在将void*转换为char,因此会发出警告。

答案 1 :(得分:5)

由于Dave已正确指出编译错误的原因:

 s[strlen(s)-2]=NULL; /* = (void*)0 */

代码中还有另一个错误,它不会导致编译错误:

if (s[0]=='"') s=s+1;

调用者无法看到s的增量,因为C经过包含指针的值(参见http://c-faq.com/ptrs/passptrinit.html)。纠正选项:

  • 使用memmove()(或其他一些复制机制)将数组内容移到左侧
  • 传递指针的地址(char**
  • 返回指向s
  • 的指针

更改s的内容是可取的,因为如果数组是动态分配的,它可以避免可能的问题:只有malloc()(或calloc()realloc()返回的指针可以传递给free()。如果s的值已更改,则free()不能s通过void strip_quotes(char s[]) {

请注意:

void strip_quotes(char* s) {

等同于:

{{1}}

因为代码中使用了指针而感到困惑。

答案 2 :(得分:0)

戴夫得到了它,但我会尝试添加一点。

NULL是void *类型的指针,可以将其指定给任何指针类型。如果要设置指向永远不能用于表示有效内存的值的指针,请使用NULL。

'\ 0',又名NUL,ascii值为0,用于终止字符串。它是char类型。 http://www.december.com/html/spec/ascii.html

答案 3 :(得分:0)

void strip_quotes(char s[]) {
    int len = strlen(s);
    if(s[len-1] == '"')
        s[--len] = '\0';
    if(s[0]=='"')
        memmove(s, s+1, len);
}