我有一个基本问题,BUFSIZ
的值(8192)基本上是一个大小为(4)的整数,适应大小为0的字符数组。
真的有可能......
输出
size of buf:0
size of INT:4
size of bufsize:4
num_process:24
after num_process:24
max_process has reached for kblockd:0
代码
#include <iostream>
using namespace std;
class ServiceUtilCheck
{
private:
FILE *ptr;
char buf[0];
char cmd[1024];
int m_max_num_process;
public:
ServiceUtilCheck()
{
m_max_num_process=15;
}
bool check_max_process(const char* processname)
{
int num_process = 0;
int ret =0;
sprintf(cmd, "/bin/ps -e | /bin/grep %s | /usr/bin/wc -l", processname);
if ((ptr = popen(cmd,"r")) != NULL )
{
if (fgets(buf,BUFSIZ,ptr) != NULL )
{
//buf[0] = (char) 3424252;
cout<<" size of buf:" << sizeof(buf) <<endl;
cout<<" size of INT:" << sizeof(int) <<endl;
cout<<" size of bufsize:" << sizeof(BUFSIZ) <<endl;
num_process =atoi(buf);
cout<<"num_process:" << num_process <<endl;
}
cout<<" after num_process:" << num_process <<endl;
if (num_process <= m_max_num_process)
ret = true;
pclose(ptr);
}
return ret;
}
};
int main ()
{
ServiceUtilCheck *serv = new ServiceUtilCheck();
bool max_process= serv->check_max_process("kblockd");
cout<<"max_process has reached for kblockd:"<< max_process <<endl;
return 0;
}
答案 0 :(得分:2)
在c ++中没有数组边界检查。因此,如果您分配的大小小于读取的字节数,则不会出现编译错误。
然而,您的程序可能会在任何时间或最坏的情况下崩溃,而不是静默地写入其他一些有意义的信息。就像已在评论中提到的那样,这是未定义的行为。
最后,0大小的数组是GNU c的一个特殊功能。它们用于容纳动态大小的数据,并在运行时使用malloc等函数分配实际大小。