Неверное первое значение в массиве указателей - PullRequest
0 голосов
/ 09 апреля 2020

Функция dynamicRandomMatrix должна возвращать указатель на массив из n указателей, каждый из которых указывает на массив из n случайных целых чисел.

Я получил его для печати в основном правильно, за исключением первого числа в массиве. Это вывод:

n=3: -2084546528, 59, 45

Может кто-нибудь помочь мне понять, почему первое число в массиве так мало? Я думаю, что это должно быть что-то делать с локальными переменными и доступа или что-то, но я не уверен.

int** dynamicRandomMatrix(int n){
    int **ptr;
    ptr = malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        int *address = randomArray(n);
        ptr[i] = address;
    }
    return ptr;
    free (ptr);
}

int* randomArray(int n){
    int *arr;
    arr = malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        int num = (rand() % (100 - 1 + 1)) + 1;
        arr[i] = num;
    }
    return arr;
    free(arr);

}

int main(){
    int **ptr;
    int i;
    ptr = dynamicRandomMatrix(3);
    printf("n=3: ");
    for (i = 0; i < 3; i++) {
        printf("%d, ", *ptr[i]);
    }
    return 0;
}

1 Ответ

2 голосов
/ 09 апреля 2020

В вашем коде

 ptr = malloc(sizeof(int) * n);

неверно, каждый элемент в массиве ptr должен указывать на int *, поэтому он должен быть ptr = malloc(sizeof(int*) * n);. Чтобы избежать этого, вы можете использовать форму:

ptr = malloc(sizeof(*ptr) * n);

При этом все ваши free(array); и free (ptr); являются мертвым кодом, как при встрече с безусловным оператором return, потоком кода (выполнение) возвращается к вызывающей стороне, и дальнейшее выполнение в этом блоке (функции) не происходит. Ваш компилятор должен был предупредить об этой проблеме. Если нет, используйте правильные флаги для включения всех предупреждений в настройках компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...