Segfault с использованием posix_memalign в структуре - PullRequest
0 голосов
/ 09 июня 2018

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

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

Это в основном метод, который я использую, и я понятия не имею, почему это не получится:

int init_const(void* data, int alignment, uint64_t size, int offset, DataType type, int stride, int numDomains){

    int i;
    size_t bytesize = 0;
    int errorCode;
    //int elements = 0;

    size_t typesize = dataTypeLength(type);

    bytesize = (size+offset) * typesize;
    //int elements = alignment / typesize;

    data = (void*)malloc(numDomains * sizeof(Datastruct));

    //Allocating memory for array of datastructures
    if(data == NULL){
        fprintf(stderr,
                "Error: Insufficient memory, can't even malloc array of pointers\n");
        exit(EXIT_FAILURE);
    }
    for(i=0; i<numDomains; i++){
        Datastruct* structure = (Datastruct*)data+sizeof(Datastruct)*i;
        errorCode =  posix_memalign(structure->a, alignment, bytesize);
        printf("Hallo");
        if (errorCode)
        {
            if (errorCode == EINVAL)
            {
                fprintf(stderr,
                    "Error: Alignment parameter is not a power of two\n");
                exit(EXIT_FAILURE);
            }
            if (errorCode == ENOMEM)
            {
                fprintf(stderr,
                    "Error: Insufficient memory to fulfill the request\n");
                exit(EXIT_FAILURE);
            }
        }
        if (structure->a == NULL)
        {
            fprintf(stderr, "Error: posix_memalign failed!\n");
            exit(EXIT_FAILURE);
        }
    }

    return 0;

}

Вот моя структура данных:

typedef struct {
    void* a;
} Datastruct;

К сожалению, это вызывает ошибку сегментации в posix_memalign, и я понятия не имею, что я делаю здесь неправильно.Возможно, это где-то испорченная операция с указателем, но я не могу понять, где.

1 Ответ

0 голосов
/ 09 июня 2018
man posix_memalign

твой друг.Вы найдете там:

int posix_memalign(void **memptr, size_t alignment, size_t size);

Таким образом, он хочет адрес указателя & Structure-> a , а не старое значение Структура-> a .

...