零长度的char缓冲区容纳整数

时间:2013-03-25 04:50:40

标签: c++

我有一个基本问题,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;
}

1 个答案:

答案 0 :(得分:2)

在c ++中没有数组边界检查。因此,如果您分配的大小小于读取的字节数,则不会出现编译错误。

然而,您的程序可能会在任何时间或最坏的情况下崩溃,而不是静默地写入其他一些有意义的信息。就像已在评论中提到的那样,这是未定义的行为。

最后,0大小的数组是GNU c的一个特殊功能。它们用于容纳动态大小的数据,并在运行时使用malloc等函数分配实际大小。

Zero length arrays