2015-01-04 2 views
0

Я делаю кодирование с помощью leetcode. Что касается двух добавочных чисел, мое решение не может быть принято, потому что я не использовал new при создании struct. Вот мой код:new необходимо использовать для создания структуры?

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { 
struct ListNode temp(-1); 
struct ListNode *pre = &temp; 
bool PlusOne = false; 
int val1 = 0; 
int val2 = 0; 
int sum; 
while (NULL != l1 || NULL != l2) 
{ 

    if (NULL != l1) 
    { 
     val1 = l1->val; 
     l1 = l1->next; 
    } 
    if (NULL != l2) 
    { 
     val2 = l2->val; 
     l2 = l2->next; 
    } 
    if (PlusOne == true) 
    { 
     sum = (val1 + val2 + 1) % 10; 
     PlusOne = (val1 + val2 + 1)/10; 
    } 
    else 
    { 
     sum = (val1 + val2) % 10; 
     PlusOne = (val1 + val2)/10; 
    } 
    struct ListNode newNode(sum); 
    pre->next = &newNode; 
    pre = &newNode; 
    val1 = 0; 
    val2 = 0; 

} 
if (true == PlusOne) 
{ 
    struct ListNode newNode(1); 
    pre->next = &newNode; 
} 
pre = temp.next; 
return pre;} 

Это говорит об ошибке во время выполнения, но это работает, если я использую предварительно> следующая = новый ListNode (1) замена STRUCT ListNode newNode (1); pre-> next = & newNode;

Есть ли кто-нибудь знает почему?

+1

Ваша программа плохо сформирована. В трех местах вы настраиваете обратный адрес автоматической переменной, которая уничтожается при выводе области. Любое использование указанного адреса, включая разыменование и даже оценку, вызывает * неопределенное поведение *. То, что вы засвидетельствовали, что «работа» на данной платформе не имеет значения, и свидетельство в замешательстве * наблюдаемого * поведения с * определенным * поведением. Вызов неопределенного поведения делает любое такое наблюдение бессмысленным. – WhozCraig

+0

Советы по стилю: Не делайте этого: 'if (true == PlusOne)'. 'PlusOne' уже является логическим, и вы, вероятно, не будете делать' if (true == (true == PlusOne)) ' – milleniumbug

+0

@milleniumbug, просьба дать более подробную информацию об этом. Я не понимал, что вы имели в виду. Спасибо! –

ответ

2

Он сказал ошибку времени выполнения, но работает, если я использую pre-> next = new ListNode (1) замену struct ListNode newNode (1); pre-> next = & newNode;

Это потому, что вы указываете на локальную переменную, которая будет уничтожена, если существует блок if.

if (true == PlusOne) 
{ 
    struct ListNode newNode(1); 
    pre->next = &newNode; 
} 

pre->next будет указывать на нераспределенную память, когда элемент управления выходит из if блока. Это похоже на это

int* get_int() { 
    int a = 1; 
    return &a; 
} 

void process_int() { 
    int *p = get_int(); 
    // oops! p is pointing to unallocated memory; undefined behaviour ensues 
    *p; 
} 

Никогда не указывайте на локальную переменную, которая не переносит ваш указатель.

Причина, по которой работы new заключается в том, что вы вручную распределяете память в freestore, которая будет жива до тех пор, пока не назовется delete или какая-либо программа (в зависимости от того, что было раньше).

+0

Благодарим за быстрый ответ! Но я тестировал свою версию с помощью VS studio, она также работала. Я понял, что вы говорите. Так может быть что-то о VC++? –

+0

Последний фрагмент кода выше, где я писал как неопределенное поведение, может/не работать, например, когда вы пытались получить доступ к памяти, он не использовался повторно для чего-то другого, поэтому может показаться, что он работает; но это бомба замедленного действия. В любое время на нем написано что-то еще, ваша программа не будет работать. – legends2k

+0

@YutaoXing. Посмотрите [здесь] (http://stackoverflow.com/q/2397984/183120) по причинам и понимаете важную концепцию на C и C++. – legends2k