Вызов Malloc сбой, но работает в другом месте - PullRequest
3 голосов
/ 06 января 2012

Интересно, может ли кто-нибудь понять это ...

Моя программа вылетает при этом вызове:

void subtract(data* array,data* inverse,int a, int b, int q, int n)
{

data* arraytomultiply;
arraytomultiply = (data *)malloc(sizeof(data*) * n);

Где данные просто содержат int (для удобства при переключении типов позже)

typedef struct { 
        int value;
}data;

Я пробовал много возиться с изменением указателей здесь, поскольку я совсем не уверен в них, но безрезультатно.

Странно то, что гораздо раньше в программе работает тот же самый вызов, я присваиваю ему значения и могу распечатать их и все.:

data* array;
array = (data*)malloc(sizeof(data*) * m * n); // m * n entries

Одна вещь, которая может быть полезной (хотя я понятия не имею, почему), это то, что когда она работает раньше, это происходит во время функции void, тогда как когда она падает, она находится в функции, вызываемой из алгоритма. но я не понимаю, как это вообще может повлиять на это, учитывая то, что я пытаюсь сделать, не используя никаких аргументов и т. д ...

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 06 января 2012

Разве это не должно быть sizeof (data) вместо sizeof (data *), поскольку вы выделяете пространство для структур данных?

1 голос
/ 06 января 2012

Вы выделяете m * n элементов data *, а не data. Если вы хотите, чтобы массив указателей был data, то то, что вы делаете в malloc(), правильно, но это должно быть присвоено data **

array = (data*)malloc(sizeof(data*) * m * n); // m * n entries

Это должно быть

array = (data*)malloc(sizeof(data) * m * n); // m * n entries

, и вы всегда должны проверять возвращаемое значение malloc(), чтобы определить, не удалось или не удалось!

if ((array = (data*)malloc(sizeof(data) * m * n)) == NULL) {
    printf("unable to allocate memory");
    return; // you can return your error code here!
}

У вашей программы есть все причины для сбоя. Но когда вы сказали, it worked earlier but crashed later заставил сделать несколько экспериментов. Я попробовал ваш фрагмент кода и нашел, что он работает для меня. Я пробовал много раз, но он никогда не падал. Я озадачился и отправил вопрос, чтобы узнать почему ?! - Доступно здесь Являются ли "malloc (sizeof (struct a *))" и "malloc (sizeof (struct a))" одинаковыми?

+ 1 к вашему вопросу!

0 голосов
/ 06 января 2012

Когда происходит сбой malloc, обычно это происходит из-за того, что вы испортили структуры, которые он использует для отслеживания памяти в куче где-то еще. Ваша программа многопоточная? Попробуйте запустить его с помощью helgrind или drd (оба инструмента valgrind). Они могут помочь вам отследить состояние гонки, незащищенный доступ к данным или другие проблемы с многопоточностью.

0 голосов
/ 06 января 2012

Вы все правы, но в любом случае мне интересно, почему это вылетает.

Интересно, потому что размер data (как определено выше), как ожидается, будет меньше или равен размеру data*.

...