【发布时间】: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/… 可能是很好的阅读。
-
在数组边界之外访问会导致未定义的行为。这就是为什么您可以获得不同的结果。