1

次のコードを検討してください (簡潔にするためにエラー チェックは削除されています)。

int main()
{
        int fd, nread;
        struct stat st_buff;

        /* Get information about the file */
        stat("data",&st_buff);
        /* Open file data for reading */
        char strbuff[st_buff.st_blksize];
        fd = open("data",O_RDONLY);

        /* read and write data */
        do {
                nread = read(fd,strbuff,st_buff.st_blksize);
                if (!nread)
                        break;
                write(STDOUT_FILENO, strbuff, nread);
        } while (nread == st_buff.st_blksize);

        /* close the file */
        close(fd);

        return 0;
}

このコードは、バッファ用にスタックにメモリを割り当てます (誤解していない場合alloca())。同じ目的で使用できた関数もあります (推測します)。どちらかを選択したい理由があるかどうか疑問に思っていましたか?

4

2 に答える 2

2

一般に、上記のように VLA を使用することをお勧めします。これは、きれいで標準的であるのに対し、alloca醜く、標準に含まれていないためです (とにかく、C 標準ではなく、おそらく POSIX にあります)。

于 2012-04-23T17:05:37.370 に答える
0

どちらもマシンコードレベルでは同じだと確信しています。どちらもスタックからメモリを取得します。これには次の意味があります。

  1. esp適切な値だけ移動されます。
  2. 取られたスタックメモリはprobe'd.
  3. 関数には適切なスタック フレームが必要です (つまり、ebp他のローカルにアクセスするために使用する必要があります)。

どちらの方法もこれを行います。どちらにも「従来の」エラー処理はありません (Windows では SEH 例外を発生させ、Linux では何でも発生させます)。

移植性を気にするなら、どちらかを選択する理由があります。VLA は標準の IMHO ではありません。allocaやや標準的なようです。

PS の使用を検討してmallocaください。

于 2012-04-23T17:11:16.717 に答える