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));
열린 노드의 크기는 구조체의 크기여야 하는데 사실 새 노드를 '삽입'하면 이 코드 줄이 틀리는데 오류는 보고되지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
CRT는 힙 버퍼가 끝난 후 애플리케이션이 메모리에 쓴 것을 감지했습니다.많은 사람들이 다른 설명을 가지고 있습니다. 제가 겪은 문제는 열려있는 메모리 공간이 작동을 위한 메모리 공간보다 작습니다. 즉, 여유 메모리가 범위를 벗어났습니다. 이것은 연결 목록 구조의 메모리를 여는 코드입니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.