我一直在C中使用ODBC。它们有一个已定义的类型:
typedef void * SQLPOINTER;
typedef unsigned int SQLUINTEGER;
我有一个函数alloc_buffer:
void db_alloc_buffer(SQLUINTEGER buffSize, SQLPOINTER *Ptr)
{
*Ptr = malloc(buffSize);
memset(*Ptr, ' ', buffSize);
}
引用Ptr是安全/正确的吗?或者我可以这样做:
void db_alloc_buffer(SQLUINTEGER buffSize, SQLPOINTER *Ptr)
{
Ptr = malloc(buffSize);
memset(Ptr, ' ', buffSize);
}
答案 0 :(得分:0)
不,取消引用Ptr
你在第二版中的方式是不安全的。 Ptr
是指向指针的指针,而不是直接指向缓冲区的指针。此函数的目的是分配可由调用者使用的缓冲区。调用者提供其指针变量的地址,并且您的函数应该分配缓冲区并将该变量设置为缓冲区的地址,并通过取消引用Ptr
并使用malloc()
的结果来执行此操作。
如果您分配给Ptr
而不是*Ptr
,则只会分配给本地变量,而不是分配给调用者的变量。
答案 1 :(得分:0)
是否可以对某个空格进行编辑?
是。为什么不能:void** p = malloc(sizeof(void*));
引用Ptr是安全/正确吗?
安全吗?仅当Ptr
指向有效内存时。如果有人打电话给db_alloc_buffer(n, NULL)
,那肯定是不安全的。
正确?这取决于你想要做什么。第二个代码似乎没用,因为你忽略了作为Ptr
传入的参数的值。
第一个版本似乎更有用,因为它至少在函数外部有一些可观察的效果,即它修改了作为SQLPOINTER
传递的Ptr
。
似乎你想要这样的东西:
SQLPOINTER db_alloc_buffer(SQLUINTEGER buffSize)
{
SQLPOINTER Ptr = malloc(buffSize);
if (Ptr == NULL) return NULL;
memset(Ptr, ' ', buffSize);
return Ptr;
}