缓冲区被使用,但可能没有被初始化(Visual Studio中)

问题描述:

这是我c++代码片段:缓冲区被使用,但可能没有被初始化(Visual Studio中)

char buff[512]; 
memset(buff, ' ', sizeof(buff)); 
GetModuleFileName(NULL, buff, _MAX_PATH); 
char *file = strrchr(buff, '.'); 

看来buff在第一线进行初始化。但是,我得到这个从Visual Studio(这是一个警告,而不是一个错误,我想删除这个警告):

'buff' is not initialized 
'buff' is used, but may not have been initialized 

什么问题?

+3

你是怎么声明'buff'的? – user0042

+0

'看起来buff是在第一行初始化的'不,它不是。 “buff”是指针还是数组?如果它是一个指针,你有没有为它分配空间 - 例如。用'新'? –

+0

初始化发生在声明点。 –

它看起来像你使用的是普通的char*指针buff这样的:的

char* buff; 

代替

char buff[_MAX_PATH]; 

memset()将不分配的缓冲区指针的内存。


另外,您还可以使用一个初始化指针:

char* buff = new[_MAX_PATH]; 

但是不要忘记调用

delete [] buff; 

话,那sizeof()不会给你的大小分配的数组,但只有指针变量本身的大小。

的甚至更好的替代方法是使用std::vector<char>代替:

std::vector<char> buff(_MAX_PATH,'\0'); 

你需要改变一些代码,使用正确,但:

GetModuleFileName(NULL, buff.data(), _MAX_PATH); 
char *file = strrchr(buff.data(), '.'); 

而且你应该初始化你的NUL字符而不是空格的缓冲区(' '):

memset(buff, '\0', sizeof(buff)); 
      // ^^ 
+0

“但是别忘了叫 'delete [] buff;'” - 或者只是使用'std :: vector'或智能指针而忘记必须手动清理。 –

+0

@Jesper当然,这将是更好的选择,但当然需要对OPs代码进行更多的更改。 – user0042

+0

我只是碰巧认为,一个好的答案应该提及更好的选择,当它们存在时:)答案是教育的绝佳机会。 –