C中相同的输入不同的输出

Same input different output in C

我用 Clion 写了一个 C 程序,使用动态内存分配。我注意到有时会为相同的输入提供不同的输出。起初我认为 Clion 有问题(我是第一次使用它),但我也 运行 来自 windows 命令行的程序,并且发生了同样的错误。


main.c

#include "main.h"

int main()
{
    int n;

    scanf("%d", &n);

    int *t = (int*)calloc(n, sizeof(int));

    for (int i = 0; i < n; ++i) {
        scanf("%d", &t[i]);
    }

    int p = peak(t, n);

    printf( p == -1 ? "No peak" : "Peak %d, position %d", t[p], p );

    free(t);

    return 0;
}

main.h

//
// Created by Botond on 2021. 02. 18..
//

#ifndef EXTRA_MAIN_H
#define EXTRA_MAIN_H

#include <stdio.h>
#include <stdlib.h>

int peak( int *t, int n)
{
    int p = -1, i = 0;

    while(t[i] <= t[i+1])
        i++;

    p = i;

    while(t[i] >= t[i+1])
        i++;

    if(i == n + 1)
        return p;
    else
        return -1;
}

#endif //EXTRA_MAIN_H

当传给peak的数组为{5,5,4,3,2,1}:

    while(t[i] <= t[i+1])
        i++;

将持续到 i == 1。然后

    while(t[i] >= t[i+1])
        i++;

i == 4时仍然为真,因此循环将再次迭代,测试变为t[5] >= t[6]。由于数组只有 6 个元素 (t[0]..t[5]),因此访问 t[6] 会导致未定义的行为。特别是,它可以读取内存中恰好是下一个的任何垃圾值,因此您的程序的行为就好像输入包含可能与下一个 运行 不同的其他垃圾值。该程序也可能崩溃或导致其他类型的问题。

您需要在这些循环中添加一个额外的条件来检查 in,这样它们就不会访问 t[n] 而是在 i+1 >= n 时终止。