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]
会导致未定义的行为。特别是,它可以读取内存中恰好是下一个的任何垃圾值,因此您的程序的行为就好像输入包含可能与下一个 运行 不同的其他垃圾值。该程序也可能崩溃或导致其他类型的问题。
您需要在这些循环中添加一个额外的条件来检查 i
与 n
,这样它们就不会访问 t[n]
而是在 i+1 >= n
时终止。
我用 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]
会导致未定义的行为。特别是,它可以读取内存中恰好是下一个的任何垃圾值,因此您的程序的行为就好像输入包含可能与下一个 运行 不同的其他垃圾值。该程序也可能崩溃或导致其他类型的问题。
您需要在这些循环中添加一个额外的条件来检查 i
与 n
,这样它们就不会访问 t[n]
而是在 i+1 >= n
时终止。