тот же адрес возвращается в C # struct указатель - PullRequest
3 голосов
/ 25 ноября 2010

Я создал структурный указатель, но каждый вызов для нового узла возвращает один и тот же адрес. Но я ожидал, что разные адреса будут возвращаться для каждого вызова нового узла. Может кто-нибудь помочь, пожалуйста?

public unsafe struct Node
{
    public int Data;
}
class TestPointer
{
    public unsafe Node* getNode(int i)
    {
        Node n = new Node();
        n.Data = i;
        Node* ptr = &n;
        return ptr;
    }
    public unsafe static void Main(String[] args)
    {
        TestPointer test = new TestPointer();
        Node* ptr1 = test.getNode(1);
        Node* ptr2 = test.getNode(2);
        if (ptr1->Data == ptr2->Data)
        {
            throw new Exception("Why?");
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Не обманывайтесь синтаксисом Node n = new Node();! Node является структурой, n размещается в стеке. Вы дважды вызываете getNode из одной и той же функции в одной и той же среде, поэтому, естественно, вы получаете два указателя на одну и ту же ячейку стека. Более того, эти указатели становятся недействительными («висящими») после возврата getNode, поскольку расположение в стеке, принадлежавшее n, может быть перезаписано другим вызовом. Короче: не делай этого. Если вы хотите, чтобы CLR выделяла память, сделайте Node классом.

0 голосов
/ 25 ноября 2010

Получает ли n мусор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...