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 шт):

Автор решения: Harry

А что вы хотите добиться функцией 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;
}
→ Ссылка
Автор решения: AlexGlebe

Второй аргумент в 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;
}
→ Ссылка