一个空洞*可以被封锁吗?

时间:2016-12-29 17:17:55

标签: c odbc

我一直在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); 
}

2 个答案:

答案 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;
}