CRT는 힙 버퍼가 끝난 후 애플리케이션이 메모리에 쓴 것을 감지했습니다.

7958 단어 신청
많은 사람들이 다른 설명을 가지고 있습니다. 제가 겪은 문제는 열려있는 메모리 공간이 작동을 위한 메모리 공간보다 작습니다. 즉, 여유 메모리가 범위를 벗어났습니다.
이것은 연결 목록 구조의 메모리를 여는 코드입니다.

 1 PNODE Create() {

 2     int len;    //total count of nodes to be created.

 3     int i;

 4     int val; //temp value for the current node.

 5     printf("enter the size of nodes:");

 6     scanf("%d", &len);

 7     PNODE pHead = (PNODE)malloc(sizeof(PNODE));

 8     pHead->pNext = NULL;

 9     PNODE pTail = pHead;

10 

11     if(NULL == pHead) {

12         printf("allocate memory failed!");

13         exit(0);

14     }

15     for (i = 0; i < len; i++)

16     {

17         PNODE pCur = (PNODE)malloc(sizeof(PNODE));

18         if(NULL == pCur) {

19             printf("allocate memory failed!");

20             exit(0);

21         }

22         printf("enter the %d-th value : ", i + 1);

23         scanf("%d", &val);

24         pCur->data = val;

25 

26         //set the new node as the tail node.

27         pTail->pNext = pCur;    

28         pCur->pNext = NULL;

29         pTail = pCur;

30     }

31     return pHead;

32 }

다음과 같이 구조체를 정의합니다.

1 typedef struct node {

2     int data;

3     struct node * pNext;

4 } NODE, * PNODE;

요소(오류를 보고하는 코드)를 삭제할 때:

 1 bool Delete(PNODE pHead, int pos, int *v) {

 2     int i = -1;

 3     PNODE pNode = pHead;

 4     while((i < pos - 1) && pNode != NULL) {

 5         pNode = pNode->pNext;

 6         i++;

 7     }

 8     if(pos < i || pNode == NULL)

 9         return false;

10     PNODE pTmp = pNode->pNext;    //store to free later.

11     *v = pTmp->data;

12     pNode->pNext = pNode->pNext->pNext;

13     free(pTmp);

14     pTmp = NULL;

15     return true;

16 }

나는 이 코드를 계속해서 디버깅하고 모든 노드의 포인터 필드와 데이터 필드가 내가 예상했던 것과 같다는 것을 발견했다.
메모리를 열었을 때 크기가 잘못 지정되었다는 것이 밝혀졌습니다.

1 PNODE pNew = (PNODE)malloc(sizeof(PNODE));

다음과 같이 변경합니다.

1 PNODE pNew = (PNODE)malloc(sizeof(NODE));

열린 노드의 크기는 구조체의 크기여야 하는데 사실 새 노드를 '삽입'하면 이 코드 줄이 틀리는데 오류는 보고되지 않습니다.

좋은 웹페이지 즐겨찾기