【发布时间】:2014-07-23 00:24:42
【问题描述】:
通常使用隐式函数返回 void * 转换来分配指针,就像 malloc() 的:
void *malloc(size_t size);
int *pi = malloc(sizeof *pi);
我想在传递目标指针的地址时执行相同的分配,而不是从函数内显式转换其类型(不在其主体内,也不在参数内)。
以下代码似乎可以实现这一点。
- 我想知道代码是否完全符合(任何) C 标准。
- 如果不符合,我想知道是否可以 在符合(任何)C 标准的同时达到我的要求。
.
#include <stdio.h>
#include <stdlib.h>
int allocate_memory(void *p, size_t s) {
void *pv;
if ( ( pv = malloc(s) ) == NULL ) {
fprintf(stderr, "Error: malloc();");
return -1;
}
printf("pv: %p;\n", pv);
*((void **) p) = pv;
return 0;
}
int main(void) {
int *pi = NULL;
allocate_memory(&pi, sizeof *pi);
printf("pi: %p;\n", (void *) pi);
return 0;
}
结果:
pv: 0x800103a8;
pi: 0x800103a8;
【问题讨论】:
-
我的结论: 1. 虽然我的示例很可能“工作”,但它不符合任何 C 标准,特别是因为它依赖于强制转换为 void **。 2. 我的假设是没有符合标准的方法可以满足上述要求。
-
更新:在符合标准的同时实现我的要求的唯一方法是实现 (int **) 到 (void **) 转换器。但是由于所述转换是实现定义的,因此只有在兼容的实现下才会符合标准。因此,我的要求是不可能的,我为鹅追逐道歉,非常感谢你的努力。
标签: c pointers strict-aliasing