Функция, возвращающая указатель на ошибку сегментации структуры - PullRequest
1 голос
/ 07 февраля 2020

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

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

header:

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

struct Double_Array{
    double** array;
    int rowsize;
    int colsize;
};

struct Double_Array* double_array(int,int);

function:

#include "header.h"


struct Double_Array* double_array( int row, int col){

    int i;

    struct Double_Array* ptrDouble_Array;

    ptrDouble_Array = (struct Double_Array*) malloc(sizeof(struct Double_Array));

    ptrDouble_Array -> rowsize = row;

    ptrDouble_Array -> colsize = col;
    for(i=0;i< ptrDouble_Array -> colsize ; i++){
        ptrDouble_Array -> array[i] = malloc((sizeof(double))*(row));
    }
    return(ptrDouble_Array);
}

mainline:

#include "header.h"


int main(){
    srand(time(0));
    printf("running");
    int i;
    int j;
    struct Double_Array* ptr;

    ptr = double_array( 5, 5);

    for(i=0;i<5;i++){
        free(ptr->array[i]);
    }
    free(ptr);

    return(0);

}

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

Что вызывает ошибку сегмента

1 Ответ

3 голосов
/ 07 февраля 2020

Вы выделяете место для каждого array[i], но вы никогда не выделяете место для array. Поэтому ptrDouble_Array->array[i] разыменовывает неинициализированный указатель, который вызывает ошибку по умолчанию.

Добавьте выделение:

ptrDouble_Array->array = malloc((sizeof(double *))*(col));
for(i=0;i< ptrDouble_Array->colsize ; i++){
    ptrDouble_Array->array[i] = malloc((sizeof(double))*(row));
}

И не забудьте free it:

for(i=0;i<5;i++){
    free(ptr->array[i]);
}
free(ptr->array);
free(ptr);
...