2012-06-07 107 views
7

我有一些代码是这样的(这不是生产代码,只是一个示例代码)什么是C中的单例指针?

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

func(&inbuf); 


..... 

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

} 

Coverity的工具说:“与& INBUF产生一个单以地址”。我听说过关于C++的单例。但是,单指针在C语言中意味着什么?

+0

单例就像一个只会创建一次的全局,每次都可以访问。查看更多信息:http://www.infernodevelopment.com/singleton-c – NKamrath

+1

向我们显示声明buf的行。 –

回答

8

单指针在C语言中的含义是什么?

在这种情况下,我认为Coverity的被参照的char *的阵列和指针之间的差,以通过利用该数组的地址创建了单个char*

Coverity的警告您通过buf的第一个元素的地址传递给func,你使之更难以为自己安全写入到阵列,因为你不能轻易确定其大小。

这很难,没有看到所有的代码可以肯定的,但假设buf是你给然后使用sizeof操作上buf从该函数将产生数组的大小你的顶级函数声明的地方数组。

但是,当在该行

func(&inbuf); 

... func传递的buf地址func仅仅接收一个指针数组的第一个元素。从func开始,您不能再使用sizeof来确定数组的大小 - it will just return the size of the pointer - 因此,如果不隐式理解数组包含多少空间,就无法安全地写入该指针。

这使得脆弱的代码,因此是不好的做法。

(这一切都不是什么做的Singleton Pattern

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++中的类型系统不区分“指向一个对象的指针”和“指向对象数组的指针”。

+2

不应该是第一行:“typeA var [x]; //声明某种类型的数组变量”? – pmod

+0

不,整点是什么使它成为一个错误是你将传递一个指向单身对象,而不是一个数组。 –