динамическое выделение памяти в c выдает ошибку для определенного размера - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать массив (динамически) и заполнить его случайными числами.

Я в Linux.Программа компилируется без ошибок.Это код C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void create_array(int **, int);
void populate_array(int *X, int size, int low, int high);
void display_array(int *X, int size);


int main()
{
    int *A = NULL;
    int size = 7;
    int low = 10;
    int high = 1000;
    create_array(&A, size);
    populate_array(A, size, low, high);
    display_array(A, size);
    return 0;
}

void create_array(int **X, int size)
{
    *X = (int *)(malloc(size));
}

void populate_array(int *X, int size, int low, int high)
{
    srand(time(0));
    for (int i = 0; i < size; ++i)
    {
        *(X + i) = low + rand() % (high + 1 - low);
    }
}

void display_array(int *X, int size)
{
    for (int i = 0; i < size; ++i)
    {
        if (i % 10 == 0)
            printf("\n");
        printf("%d\t", *(X + i));
    }
    printf("\n");
}

Однако, когда я его запускаю, я получаю следующую ошибку:

malloc.c:2394: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped)

Эта ошибка возникает только для size = 7.Для более низких значений это все хорошо.Но для более высоких ценностей это другая история!Вывод для size = 20:


455     526     335     719     907     695     1041    0       154481972       154546741
154481459       154743095       154482992       875836721       960049720       926419250       909326389       154219063       808465977       842479924

Напротив, та же самая программа (почти) на C ++ дает ожидаемый результат.Вот код:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void create_array(int *&, int);
void populate_array(int *X, int size, int low, int high);
void display_array(int *X, int size);

int main()
{
    int *A;
    int size = 100;
    int low = 10;
    int high = 1000;
    create_array(A, size);
    populate_array(A, size, low, high);
    display_array(A, size);
    return 0;
}

void create_array(int *&X, int size)
{
    X = new int[size];
}

void populate_array(int *X, int size, int low, int high)
{
    srand(time(0));
    for (int i = 0; i < size; ++i)
    {
        X[i] = low + rand() % (high + 1 - low);
    }
}

void display_array(int *X, int size)
{
    for (int i = 0; i < size; ++i)
    {
        if (i % 10 == 0)
            cout << endl;
        cout << X[i] << "\t";
    }
    cout << endl;
}

Что я делаю не так?

1 Ответ

0 голосов
/ 28 января 2019
*X = (int *)(malloc(size));

Вы выделяете size количество байтов, возможно, то, что вы хотите, это

*X = malloc(sizeof(int)*size);

Примечание: malloc принимает количество байтов для выделения в качестве аргумента.Также для реализации c вы можете прочитать Почему бы не привести приведение к malloc .

...