【问题标题】:Same input different output in CC中相同的输入不同的输出
【发布时间】:2021-02-19 22:20:26
【问题描述】:

我在 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 函数没有检查以避免超出数组末尾。
  • 此外,您通常不应在.h 文件中定义函数。 .h 文件应该只包含声明 int peak(int *, int); 并且代码本身应该放在一个单独的 .c 文件中,该文件还包括 .h 文件,您可以单独编译并链接在一起。
  • 关于 .c 和 .h 文件,stackoverflow.com/questions/5904530/… 可能是很好的阅读。
  • 在数组边界之外访问会导致未定义的行为。这就是为什么您可以获得不同的结果。

标签: arrays c output


【解决方案1】:

当传递给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] &gt;= t[6]。由于数组只有 6 个元素 (t[0]..t[5]),因此访问 t[6] 会导致未定义的行为。特别是,它可以读取内存中下一个碰巧出现的垃圾值,以便您的程序表现得好像输入包含其他垃圾值,这些垃圾值可能与下一次运行不同。该程序还可能崩溃或导致其他类型的问题。

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

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2019-10-16
    • 2019-04-21
    相关资源
    最近更新 更多