什么是C中的Singleton指针?

时间:2012-06-07 15:23:51

标签: c pointers singleton

我有一些像这样的代码(这不是生产代码。只是一个示例代码)

char *inbuf = NULL;
inbuf = buf; //buf is some other valid buffer of size 100.

func(&inbuf);


.....

void func(char **p)
{
  ...
  (*p)++;
  ...

}

Coverity Tool说“使用& inbuf获取地址会产生一个单身”。我听说过关于C ++的单例一词。但是,单个指针在C方面意味着什么?

2 个答案:

答案 0 :(得分:8)

  

单个指针在C方面意味着什么?

在这种情况下,我认为Coverity指的是char *数组与通过获取该数组的地址而创建的单个char*的指针之间的区别。

Coverity警告你,通过将buf的第一个元素的地址传递给func,你会让自己更难以安全地写入该数组,因为你不能轻易确定它的大小。

如果没有看到所有代码,很难确定,但假设buf是一个数组,您已在顶层函数中声明了某个位置,然后在{{1}上使用sizeof运算符从该函数将产生数组的大小。

但是,当您在

行传递buf到[{1}}的地址时
buf

... func仅接收指向该数组的第一个元素的指针。从func(&inbuf); 开始,您无法再使用func来确定数组的大小 - it will just return the size of the pointer - 所以如果没有一些隐含的理解,那么您无法安全地写入该指针。数组包含。

这使得代码易碎,因此实践很差。

(这些与Singleton Pattern

无关

答案 1 :(得分:0)

Coverity分析标志着以下模式的缺陷:

typeA var;        // declare a variable to some type
func(&var)        // call a function passing the address of var

func(typeA *var) {
      ...
      var++;      // inside the function do pointer arithmetic on var

这通常是一种错误模式,因为函数需要一个指向缓冲区的指针,但是你向它传递一个指向单例值的指针。 C / C ++中的类型系统不区分“指向一个对象的指针”和“指向对象数组的指针”。