3

これは、Stroustrupの「C++プログラミング言語」の最新バージョンからの質問です。

私はここ数日、頭の中でこれを熟考してきました。

私が思いつくことができる唯一のこと(そしてこれはおそらく間違っています)は次のようなものです:

int* f(int n) {
  int* a = &a - n * sizeof(int*);
  return a;
}

私の意図は、スタックの上位にある何かのアドレスを取得することです。これは意味がありますか?他に誰か答えがありますか?これは第5章(ポインター、配列、および構造)にあるため、本の後半で答えに何かが含まれるべきではないことを忘れないでください。

4

5 に答える 5

4

私がCコードで頻繁に使用する例は次のとおりです。

C *c = (C*) malloc(sizeof *c);
...
free(c);

これには、ポインターと構造が含まれます。確かに、C ++で代わりにnew言うことで、そのイディオムを使用する必要がなくなります。new C

于 2009-07-25T00:57:58.193 に答える
3

私が知っている唯一の(かろうじて)合理的なケースは、オブジェクト自体へのポインターをそのコンストラクターに渡したい場合です。たとえば、循環リンクリストノードがあるとします。

class Node
{
public:
    Node(Node* next): next(next) {}
private:
    Node* next;
};

スタック上に単一要素の循環リストを作成したいとします。あなたはこれを行うことができます:

Node n(&n);

実際には実用的ではないが(つまり、なぜそのようなものが必要になるのかわかりません)、それ以外の場合は有効な他のいくつかの例:

int n = sizeof(n);
void* p = &p;
于 2009-07-25T00:51:04.150 に答える
0

正しい方法だと思います。ただあなたは多くのことを世話する必要があります:)

まず、nはaのサイズで乗算されるため、sizeofは必要ありません。基本的に、スタックに必要なアドレスを取得するには、適切なタイプのポインターを選択する必要があります。

int*  a = &a - n; // so if n==1 => a = &a - (1*4)
char* b = &b - n; // so if n==1 => b = &b - (1*1)

第二に、あなたはエンディアンの世話をしなければなりません。

また、何かを忘れたかどうかはわかりません:)

于 2009-07-25T00:46:44.463 に答える
0

まず、スタックがどちらの方向に成長するかについての保証はありません。あなたのコードはそれが成長することを前提としていますが、それはまた成長する可能性があります(つまり、より低いアドレスに)。また、スタックの上位にあるものを取得しようとしたときに、気付かない可能性のあるもの(リターンアドレス、スタックフレーム、レジスタなど)や、過去に「ジャンプ」しないものがあります。

最終的に何をしようとしていますか?

于 2009-07-25T00:51:58.300 に答える
0

最初の要素でそのサイズを保持する必要がある整数型の配列を考えてみましょう。

// clang++ --std=c++11 initializer.cpp -o initializer

#include <iostream>

using namespace std;

void Print(int* array) {
    cout << "array has " << *array << " elements" << endl;
    for(int count {*array}; count; --count) {
        cout << *++array << endl;
    }
}

int main(int, char* []) {
    {
        int elements[] {sizeof(*elements), 1, 2, 3};
        *elements = sizeof(elements) / *elements - 1;
        Print(elements);
    }
    cout << "---" << endl;
    {
        int elements[] {sizeof(*elements)};
        *elements = sizeof(elements) / *elements - 1;
        Print(elements);
    }
    return 0;
}

出力:

./initializer                                                                                                                                                                                                     
array has 3 elements
1
2
3
---
array has 0 elements

GitHubのPSの例:第8章:演習9.3

于 2014-10-04T00:33:56.493 に答える