Terminated due to signal: BUS ERROR (10) выводит 50 на 50
вот такой вот код. То работает то в ошибку падает. Примерно 50 на 50. Если кто знает подскажите пожалуйста почему так происходит.
#include <stdio.h>
void print_int(int arg) {
printf("%d", arg);
}
int f(int *array, int size) {
for (int i = 0, j = size - 1; i < size / 2; i++, j--)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
for (int i=0; i<size; i++) {
print_int(array[i]);
}
return 0;
}
int g(int* array, int* limit) {
for (int i = 0, j = *limit - 1; i < *limit / 2; i++, j--)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
for (int* current = array; current < limit; current++)
print_int( *current );
return 0;
}
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
f( array, 9 );
g( array, array + 9);
return 0;
}
Ответы (2 шт):
А что вы хотите добиться функцией g? Вы в ней разыменовываете второй аргумент j = *limit - 1; i < *limit / 2; — а он у вас выходит за рамки вашего массива, вот и получается UB...
Кажется мне, что вы хотели что-то вроде
int g(int* array, int* limit)
{
for (int i = 0, j = limit - array - 1; i < (limit - array) / 2; i++, j--)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
for (int* current = array; current < limit; current++)
print_int( *current );
return 0;
}
Второй аргумент в g( array, array + 9); - это указатель на "последний" элемент массива, который нельзя трогать. А вы в функции используете его как индекс (это совсем разные вещи).
Циклом вы пытаетесь пройти по массиву, но берёте значение , и используете его как индекс (это совсем разные вещи).
// * limit - 1 == limit [ 0 ] - 1
// * limit / 2 == limit [ 0 ] / 2
// * (array + 9) - 1 == array [ 9 ] - 1
// * (array + 9) / 2 == array [ 9 ] / 2
for (int i = 0, j = *limit - 1; i < *limit / 2; i++, j--)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
Убираем звёздочки * limit, работаем указателями limit в цикле. Меняем работу по индексу [ j ] на работу по указателю * j.
int g(int* array, int* limit) {
int * j = limit - 1;
for (int i = 0; i < ( limit - array ) / 2; i++, j--)
{
int tmp = array[i];
array[i] = * j ;
* j = tmp;
}
for (int* current = array; current < limit; current++)
print_int( *current );
return 0;
}