Добавить адрес в массив указателей C

Я должен написать функцию, которая добавит адрес в конце массива указателей. Вот что я сделал. Я хочу знать, правильно ли я поступил, а если нет, поправьте меня.

#include <stdio.h>
#include <stdlib.h>
#define MAX 3

void add( int *array[MAX], int *addr)
{
    array = realloc(array, 1*sizeof(int));
    array[MAX+1] = addr;
}

int main()
{
    int *addr = 4;
    int *array[MAX] = {"1","2","3"};
    add(array, addr);
    int i;
    for(i = 0; i<4;i++)
        printf("%d ", array[i]);

    return 0;
}

1 ответ

Решение

Из руководства для realloc:

Функция realloc() изменяет размер блока памяти, на который указывает ptr, на размер в байтах. Содержимое будет неизменным в диапазоне от начала региона до минимума старого и нового размеров. Если новый размер больше старого, добавленная память не будет инициализирована. Если ptr равен NULL, то вызов эквивалентен malloc(size) для всех значений размера; если размер равен нулю, а ptr не равен NULL, то вызов эквивалентен free(ptr). Если ptr не равен NULL, он должен быть возвращен более ранним вызовом malloc(), calloc() или realloc(). Если область, на которую указывает указатель, была перемещена, выполняется освобождение (ptr).

если слишком долго читать плохо объясняю.

Прежде всего, вы должны использовать realloc после выделения памяти (например, с помощью malloc), а не после локального объявления

во-вторых, вы обрабатываете указатели на int ( int *), как если бы они были int. также отображается как предупреждение

Примеры:

int *addr = 4; 
int *array[MAX] = {"1","2","3"}; 
array = realloc(array, 1*sizeof(int));     // here you're using sizeof( int )

Другая проблема - выход за пределы массива

 array[MAX+1] = addr;

для массива с 3 пробелами - у вас есть массив [ 0 ], массив [ 1 ] и массив [ 2 ].

в этой строке вы пытаетесь достичь массива [ 4 ] массива (предположительно) размера 4 -> за пределами

мой предложенный код для этого будет:

Код отредактирован

#include <stdio.h>
#include <stdlib.h>
#define MAX 3

void add( int **array[ MAX ], int *addr )
{
    *array = realloc( *array, ( MAX + 1 ) * sizeof( int* ) );
    (*array)[ MAX ] = addr;
}

int main()
{
    int i;
    int *addr;
    int **array;

    addr = &i;
    array = malloc( MAX * sizeof ( int* ) );
    for ( i = 1; i <= MAX; i++ ) {
        array[ i - 1 ] = addr + 4 * i;
    }

    add( &array, addr );

    for ( i = 0; i < MAX + 1; i++ ) {
        printf( "%p ", array[ i ] );
    }

    return 0;
}
Другие вопросы по тегам