2015-01-04 2 views
0

나는 leetcode로 코딩을하고있다. 두 숫자의 질문에 대해서는 struct를 만들 때 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)구조체 ListNode의 newNode의 대체 (1); pre-> next = & newNode;

그 이유는 무엇입니까?

+1

프로그램이 잘못 구성되었습니다. 세 곳에서 scope-exit에서 삭제 된 자동 변수의 반송 주소를 설정했습니다. 참조 해제 및 평가까지 포함하여 해당 주소를 사용하면 * 정의되지 않은 동작 *이 발생합니다. 특정 플랫폼에서 "작업 중"이라는 것을 목격했다는 사실은 관련이 없으며 * 정의 된 동작과 혼동되는 관찰 된 동작에 대한 증언과는 관련이 없습니다. 정의되지 않은 동작을 호출하면 이러한 관찰을 의미가 없습니다. – WhozCraig

+0

스타일 조언 :하지 마세요 : if (true == PlusOne)'. 'PlusOne'은 이미 부울입니다. 아마도'if (true == (true == PlusOne))' – milleniumbug

+0

@milleniumbug, 이것에 대해 더 자세히 알려주십시오. 나는 네가 의미하는 바를 이해하지 못했다. 고맙습니다! –

답변

2

런타임 오류가 발생했으나 사전 -> 다음 = 새 ListNode (1)을 사용하면 작동합니다. 구조체 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이 작동하는 이유는 delete이 호출되거나 프로그램이 존재할 때까지 (둘 중 빠른 날짜) 프리 상태로 메모리를 수동으로 할당하기 때문입니다.

+0

빠른 답변 주셔서 감사합니다. 그러나 나는 VS studio를 사용하여 내 버전을 테스트했으며, 또한 작동했습니다. 네가하는 말을 이해했다. VC++에 대해 뭔가있을 수 있습니다. –

+0

위의 마지막 코드 스 니펫은 정의되지 않은 동작으로 작성했지만 작동하지 않을 수도 있습니다. 즉, 메모리에 액세스하려고 시도했을 때 다른 용도로 다시 사용되지 않았으므로 작동하는 것처럼 보일 수 있습니다. 그러나 시한 폭탄입니다. 다른 것에 뭔가 쓸 때마다 프로그램이 작동하지 않습니다. – legends2k

+0

@ YutaoXing C 및 C++의 중요한 개념을 이해하고 이해하는 데있어 [여기] (http://stackoverflow.com/q/2397984/183120)를 참조하십시오. – legends2k

관련 문제