Segfault在结构中使用posix_memalign

时间:2018-06-09 15:33:43

标签: c pointers struct segmentation-fault allocation

我现在遇到了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;

}

这是我的datastruct结构:

typedef struct {
    void* a;
} Datastruct;

可悲的是,这会导致posix_memalign出现分段错误,我不知道我在这里做错了什么。它可能是一个混乱的指针操作,但我无法弄清楚在哪里。

1 个答案:

答案 0 :(得分:2)

man posix_memalign

是你的朋友。你会在那里找到:

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

所以它希望指针&amp; structure-&gt; a 的地址不是旧值 structure-&gt; a