0

memset() を使用してバッファを初期化し、別の呼び出しを使用して特定のデータを追加することは有効ですか?

例:

        DIR *dirp;
        struct dirent *dp;
        struct dirent *buf;

        dirp = opendir("/dev");
        if( dirp ) {
            buf = (struct dirent *)malloc(offsetof(struct dirent, d_name) + NAME_MAX + 1);
            if (buf == NULL) {
                closedir( dirp );
                return = ENOMEM;
            }
            while( readdir_r(dirp, buf, &dirp) == 0 && dirp ) {
                if( strncmp( dp->d_name, "video", 5 ) == 0 ) {
                    char vidpath[21];
                    memset( vidpath, 0x0, sizeof( vidpath ) );
                    snprintf( vidpath, 20, "/dev/%s", dp->d_name );

                    // Now do an operation that prints the buffer...

                }
            }
            free ( buf );
            closedir( dirp );
        }

よろしく

4

3 に答える 3

0

memsetメモリを特定の値に初期化するため、望ましくない副作用がないことを確認することは間違いなく有効であり、良い習慣です。とにかくsnprintfを使用しているので、サイズ1を渡しているため、厳密には必要ないため、ループ内でmemsetは必要ありません。

sizeof(vidpath)ただし、snprintf にも使用する必要があります。

 snprintf( vidpath, sizeof(vidpath), "/dev/%s", dp->d_name );
于 2013-06-16T12:11:42.747 に答える
0

最初に次の点に注意してください。

char vidpath[21];
memset( vidpath, 0x0, sizeof( vidpath ) );

次のように記述できます。

char vidpath[21] = {0};

しかし、もちろんmemset、あなたがしたように呼び出すことは有効です。

今あなたが呼んsnprintfでいるように、最初にバッファを初期化するポイントはありません。

また、代わりに:

snprintf( vidpath, 20, "/dev/%s", dp->d_name );

あなたは書ける

snprintf( vidpath, 21, "/dev/%s", dp->d_name );

またはそれ以上

snprintf( vidpath, sizeof vidpath, "/dev/%s", dp->d_name );

いつものようsnprintfに null ターミネータを書き込みます (指定された最大サイズが の場合を除く0)。

于 2013-06-16T12:14:16.383 に答える