Вдохновленный этой темой , я решил написать простую программу, которая делает именно это.
Логика не сложная, и у меня есть рабочая программа 75% времени. Количество запрашиваемых чисел определяется как #define BUFSIZE x
, где x
может быть произвольным целым числом.
Проблема возникает, когда ((BUFSIZE+1) % sizeof(int)) == 0
.
Так, например, если BUFSIZE=10
, моя программа ведет себя правильно, когда BUFSIZE=11
я получаю странное поведение.
Вот исходный код:
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 7
int max(int *buf);
int main()
{
int bufsize = BUFSIZE, *buf = malloc(sizeof(int[bufsize]));
// read values
int *ptr = buf;
while(--bufsize + 1)
{
printf("Input %d: ", BUFSIZE - bufsize);
scanf("%d", ptr);
++ptr;
}
// reset pointer and determine max
ptr = buf;
printf("\nMax: %d\n", max(ptr));
// cleanup
free(buf);
ptr = NULL;
buf = NULL;
exit(EXIT_SUCCESS);
}
int max(int *buf)
{
int max = 0;
while(*buf)
{
printf("%d\n", *buf);
if(*buf > max) max = *buf;
++buf;
}
return max;
}
И некоторые примеры вывода для BUFSIZE = 2 (правильно) и BUFSIZE = 3 (неправильно).
suze:/home/born05/htdocs/experiments/c# gcc input.c && ./a.out
Input 1: 12
Input 2: 23
12
23
Max: 23
suze:/home/born05/htdocs/experiments/c# gcc input.c && ./a.out
Input 1: 12
Input 2: 23
Input 3: 34
12
23
34
135153
Max: 135153
У меня такое чувство, что это что-то чрезвычайно логичное, но я не могу точно указать причину этого неправильного поведения. Может ли кто-нибудь указать на (возможно, очевидный) недостаток для меня?