1

基本的な質問が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;
}
4

1 に答える 1

2

C++では配列境界チェックはありません。したがって、割り当てられたサイズが読み取ったバイト数よりも少ない場合、コンパイルエラーは発生しません。

ただし、プログラムはいつでもクラッシュする可能性があり、最悪の場合、他の意味のある情報のメモリをサイレントに上書きする可能性があります。すでにコメントで述べたように、これは未定義の動作です。

最後に、0サイズの配列はGNUcの特別な機能です。これらは動的なサイズのデータ​​に対応するために使用され、実行時に、mallocなどの関数を使用して実際のサイズで割り当てられます。

長さゼロの配列

于 2013-03-25T04:55:29.663 に答える