操作' i'可能是未定义的

时间:2014-11-16 20:45:09

标签: c undefined-behavior sequence-points

我有这段代码采用bla_2形式的字符串并将其分开:

void separate(char* str, char* word, int* n) {
    int i = 0;
    while(str[i] != '_') {
        word[i] = str[i++];
    }
    *n = str[++i] - '0';
}

我得到了:

warning: operation on ‘i’ may be undefined [-Wsequence-point]

但我只是通过i运算符更改++,我没有分配任何内容。

那么,为什么是UB,如果是的话?如果没有,如何摆脱警告?

请注意,在我看来,this问题会处理不同的问题。

2 个答案:

答案 0 :(得分:4)

word[i] = str[i++];是个问题。

如果iword[i] i str[i++]; i++ word[i] = str[i]; i++; while(str[i] != '_')中递增while(str[i] != '_' && str[i] != '\0')

,则选择编译器

在作业后执行{{1}}

{{1}}

进一步{{1}}可能应该是

{{1}}

防止缓冲区溢出。

答案 1 :(得分:2)

原因是赋值的双方都取决于i的值,但是,您在语句中修改i并且在两次使用之间没有序列点i。根据C标准,这会导致不确定的行为。

要修复此警告,请将相关行更改为

word[i] = str[i];
i++;

顺便说一句,您可以使用指针而不是显式索引,这可能会使代码更具可读性:

void separate(char* str, char* word, int* n) {
    while(*str != '_') {
        *word++ = *str++;
    }

    *n = *++str - '0';
}