나는 malloc “ing 및 메모리 해제를 연습하려고했지만이 프로그램에서 free () 함수를 실행할 때 잘못된 포인터에 대해 오류가 반환됩니다. 누구든지 내가 뭘 잘못하고 있는지 말해 줄 수 있나요?
오류는 다음과 같습니다. *`. / malloc1 “: free () : 잘못된 포인터 : 0x000000000216c421 * 중단됨
그리고 여기에 내 코드 :
포함
include
int main (void) {// 오래된 파일 열기 FILE * old_file = fopen ( “words.txt”, “r”); if (old_file == NULL) { printf ( “파일을 찾을 수 없습니다.”); return 1;}
//open a new file FILE* new_file = fopen("new_words.txt", "w"); if (new_file == NULL) { printf("Unable to create file."); return 2; } for (int i = 0; i < 21; i++) { char* storage = malloc(sizeof(char)); if (storage == NULL) { printf("Error."); return 3; } fread(&storage, sizeof(char), 1, old_file); fwrite(&storage, sizeof(char), 1, new_file); free(storage); } //close both files fclose(old_file); fclose(new_file);
}
답변
문제는 fread(&storage, sizeof(char), 1, old_file);
에 있습니다.이 줄은 포인터에 직접 읽은 데이터를 저장하여 malloc “d 메모리의 주소를 덮어 씁니다. 포인터에 저장된 주소가 가리키는 메모리에 데이터를 저장하지 않습니다. free () 호출이 실행되면 잘못된 주소를 해제하려고합니다. 또한 malloc “d 메모리의 주소가 교체되기 때문에 메모리 누수가 발생합니다. fread () 및 fwrite ()에서 &
를 제거하면 작동합니다.
이 질문에 대한 답변이 있으면 확인 표시를 클릭하여 수락하십시오. 포럼 유지 관리를 계속 진행하겠습니다. 😉