0

コードの一部を理解しようとしています。説明を簡単にし、不必要な混乱を避けるために、多くのコードを省略しています

typedef void *UP_T;

void FunctionC(void *pvD, int Offset) {
    unsigned long long int temp;
    void *pvFD = NULL;

    pvFD = pvD + Offset;
    temp = (unsigned long long int)*(int *)pvFD;
}

void FunctionB(UP_T s) {
    FunctionC(s, 8);
}

void FunctionA() {
    char *tempstorage=(char *)malloc(0);
    FunctionB(tempstorage);
}

int main () {
    FunctionA();
    return 0;
}

私が言ったように、私は大量のコードを省略しています。したがって、コードが 2 行しかないため役に立たないように見える関数です。

とはtemp? それが私を混乱させているものです。このコードに似たものを実行しprintf()、途中でステートメントを使用すると、 の乱数が得られ、pvDそのpvFD乱数に 8 を加えた値になります。

ただし、値を誤って出力することもできます (%llu代わりに などを使用%d)。プラス 8のメモリ内の場所へのポインターであると確信していtempstorageます。これは正しいですか? その仮定の下で続行する前に、確認したいだけです。

4

2 に答える 2

3

標準でmalloc(0)は、 が NULL または有効なポインターを返すことを指定していますが、そのポインターは逆参照されません。実際の実装に関する制約はないため、返されたポインターがプラス 8 であることに依存することはできません。

于 2012-12-31T14:42:06.550 に答える
1

通常は非決定論的であるという意味でランダムですmalloc(つまり、実行ごとに異なる結果が得られます)。

の結果malloc(0)は実装定義です (ただし、完全に有効です)。逆参照するべきではありません。また、算術を実行しようとしてもいけません (ただし、これは一般的に正しいことです。算術を使用して、割り当てられたメモリの境界を超えるポインターを作成しないでください)。ただし、それを呼び出すfreeことはまだ問題ありません。

于 2012-12-31T14:39:59.943 に答える