0

我的导师给了我以下功能。所以不要怪我模棱两可哈哈

void step_step_step(char *first, char *second, char *third)
{
    if (third[3] == second[2] + 8 && second[2] == first[1] + 8)
        printf("8: Illinois\n");
    else
                printf("8: ERROR\n");
}

我尝试以这种方式调用该函数:

char *p8_1 = (char*) malloc(sizeof(char)*11);
    char *p8_2 = (char*) malloc(sizeof(char)*11);
    char *p8_3 = (char*) malloc(sizeof(char)*11);
    p8_1[9] = 'u';
    p8_2[2] = p8_1[9];
    p8_2[10] = p8_1[9];
    p8_3[3] = p8_2[10];
    step_step_step(p8_1, p8_2, p8_3);

而且一直打印错误。我在这里做错了什么?我不明白为什么当我的其他解决方案这样做时这不起作用:

p8_2[2] = p8_1[1] + 8;
p8_3[3] = p8_2[2] + 8;
step_step_step(p8_1, p8_2, p8_3);
4

3 回答 3

5

可能的运算符优先级错误:

改成: if ((third[3] == second[2] + 8) && (second[2] == first[1] + 8))

关于“操作顺序”的 wiki 文章详细介绍了评估优先级。

如果你不能在一眨眼的时间内向某人解释,某些表达式将以何种顺序被评估——你应该使用足够多的括号,这无关紧要(因为没有优先顺序),或者很明显如何条款是分开的。

编辑:

仔细观察让我意识到发生了一些可疑的事情。你没有增加任何指针。如果你是,你会做类似的事情if ((third[3] == second[2 + 8]) && (second[2] == first[1 + 8]))

于 2013-09-06T20:12:40.507 回答
3

您认为该if条件应该通过,因为您要检查的所有元素都已初始化为'u'. 在您的代码中,这适用于p8_3[3]p8_2[10]p8_2[2]p8_1[9]。然后,有调用:

step_step_step(p8_1, p8_2, p8_3);

作为third取值p8_3,索引它的第三个元素很好,它有 value 'u'。但是,second[2]具有值'u',然后在==比较之前将 8 添加到它。这会==导致错误的评估。&&短路,取的else情况if

如果没有发生短路,则右边的表达式将与&&比较。由于未初始化,这将导致未定义的行为。second[2]first[1] + 8first[1]


索引运算符的ptr[index]行为类似于*(ptr + index). 所以,表达式:

second[2] + 8

翻译成:

*(second + 2) + 8

这绝对*(second + 2 + 8).

于 2013-09-06T20:16:00.743 回答
1

看起来 p8_1[1] 尚未初始化。在您的“工作”示例中,您将 p8_1[1] 中的随机值分配给 p8_2[2],从而导致它们相等。如果您尝试添加指针,则需要使用不同的语法:

(pointer + (8*sizeof(char))[<index>]
于 2013-09-06T20:22:10.943 回答