我现在面临着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 pointersn");
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 twon");
exit(EXIT_FAILURE);
}
if (errorCode == ENOMEM)
{
fprintf(stderr,
"Error: Insufficient memory to fulfill the requestn");
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的分段错误,我不知道我在这里做错了什么。这可能是某个地方的混乱指针操作,但我无法弄清楚在哪里。
man posix_memalign
是你的朋友。你会在那里找到:
int posix_memalign(void **memptr, size_t alignment, size_t size);
所以它想要指针的地址&structure->a 而不是旧的值structure->a。