Visual Studio에서 나에게 미친 문제가 발생했습니다. 할당되지 않은 포인터에 관한 것입니다.Visual Studio unallocted 포인터가 NULL이 아닙니다.
간단한 연결 목록 응용 프로그램을 작성하고 싶습니다. 문제는 해제 된 포인터와 할당되지 않은 포인터가 NULL이 아니기 때문에 목록을 반복 할 수 없기 때문입니다.
라인 문제 1과 문제 2, listTemp-> pNext는 NULL하지만 0xfdfdfdfd없는에서 C 코드
#include "stdafx.h"
#include <malloc.h>
typedef struct _item
{
char data;
struct _item * pNext;
}item, *pItem;
int _tmain(int argc, _TCHAR* argv[])
{
pItem listHead;
pItem listTemp;
pItem listCurr;
listHead = (pItem) malloc(sizeof(listHead));
listHead->data = '0';
listHead->pNext = NULL; //will create exception in free
listTemp = listHead;
while(listTemp->pNext != NULL) //issue 1
{
listTemp = listTemp->pNext;//0xfdfdfdfd - never NULL? how to check?
}
listCurr = (pItem) malloc(sizeof(listHead));
listCurr->data = '1';
listCurr->pNext = NULL; //will create exception in free
listTemp->pNext = listCurr;
listTemp = listHead;
while(listTemp->pNext != NULL) //issue 2
{
printf("%d ", listTemp->data - 48); //"0 "
listTemp = listTemp->pNext;
}
printf("%d ", listTemp->data - 48);
free(listTemp); //is set to oxfeeefee not to NULL? //issue 3
listTemp = listHead;
while(listTemp->pNext != NULL) //issue 4
{
listTemp = listTemp->pNext;
}
free(listTemp);//Not null?
return 0;
}
다음 고려하십시오. 이렇게하면 라인 이슈 3에서리스트 의 마지막 요소를 가져 오지 못하게됩니다. free는 해제 된 포인터를 null로 설정하지 않고 0xfeeefeee로 설정합니다. 이렇게하면 마지막 요소를 다시 가져올 수 없습니다.
어떻게 이러한 문제를 해결할 수 있습니까? 도움 주셔서 감사합니다.
변수는 단순히 초기화되지 않습니다. 디버거는 거기에 0xfdfdfdfd 패턴을 저장하여 초기화하지 않은 장소를 찾을 수 있도록 도와줍니다. 릴리스 빌드에서는 그러한 일이 발생하지 않습니다. BTW :'calloc() '을 확인하고 C에서 그러한 함수의 반환 값을 캐스팅하는 것을 중단하십시오. –
Ulrich, 답장을 보내 주셔서 감사합니다. 0xfdfdfdfd 패턴을 이해했습니다. 문제는 어떻게 코드를 디버깅합니까? – esso
이것은 주로 C 질문입니다. 그래서 그 태그를 추가했습니다. –