将指针变量作为指向C中其他类型的指针进行访问 [英] Accessing pointer variable as a pointer to a different type in C
本文介绍了将指针变量作为指向C中其他类型的指针进行访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
通过取消指向指向不同类型或void
的指针的指针来访问指针变量是一种好习惯吗?这可以打破严格的别名规则吗? C和C ++在别名规则上有一些区别.在此问题中,我们重点关注C.可以在
Is it good practice to access a pointer variable by dereferencing a pointer to a pointer, which points to a different type or void
? Could this break strict aliasing rules? C and C++ have some differences in aliasing rules. In this question we focus on C. The other question considering C++ can be found here. In the following example a double*
is accessed as a void*
.
int create_buffer(void** ptr, ...)
{
*ptr = malloc(...);
...
}
int main(void)
{
double* buffer;
// The problematic code is here, double**
// is coerced to void**, which is later
// dereferenced by the function
create_buffer((void**)&buffer, ...);
...
}
以下各项是否更好:
// keeping void** just as an indicator in the interface
// that the pointer is pointing to a pointer to any type
// it could be replaced by just void*
int create_buffer(void** ptr, ...)
{
void* result = malloc(...);
memcpy((void*)ptr, &result, sizeof result);
}
推荐答案
我宁愿这样写,假设您使用"int"向调用者返回一些有用的信息,而这些信息离不开:>
I would rather write it like this, assuming you use the "int" to return some useful information to the caller that it can't do without:
void *create_buffer(size_t n, int *otherInfo) {
void *ptr = malloc(n);
*otherInfo = 0;
if (ptr) {
// Do whatever other initialization is expected
// memset(ptr, 0, n);
} else {
*otherInfo = -1;
}
return ptr;
}
int main(void)
{
double* buffer;
int code;
/* cast is not required by language or compiler,
but I still find it useful when reading */
buffer = (double *)create_buffer(SIZE_REQUIRED, &code);
/* equality testing can be done either way. This way here,
if you ever forget a =, will never compile anywhere. Nowadays
many compilers are smart enough to catch it on their own anyway */
if (NULL == buffer) {
// Handle out of memory error or other problem
switch(code) {
case -1:
fprintf(stderr, "Out of memory\n");
...
default:
fprintf(stderr, "Unexpected error %d\n", code);
break;
}
}
}
这篇关于将指针变量作为指向C中其他类型的指针进行访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文