파일로부터 몇 바이트를 읽어 다음 추출 된 코드를 고려하지 :동적 배열은
모두 (데이터 배열 파일과 같은 바이트를 가짐) 부하가 예상 결과를 반환하는 함수 호출typedef struct A{
int size;
char * dataArray;
}A
A load(char* filename, int inSize)
{
A newA;
newA.size = inSize;
FILE *filePtr;
filePtr = fopen(filename,"rb");
char buff[1];
int i = 0;
newA.dataArray = (char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
newA.dataArray[i] = buff[0];
}
char* copyOfDataArray = (char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
copyOfDataArray[i] = newA.dataArray[i];
}
newA.dataArray = copyOfDataArray;
return newA
}
void Initialize()
{
A first = load("file1", 100);
A second = load("file2", 20);
}
. 변수 first와 second는 결코 다시 사용되지 않습니다.
그러나 코드 수백 라인의 몇 후 프로그램은 항상 함께 충돌 :
*malloc.c:2451: sYSMALLOC: Assertion '(old_top == (..... failed.*
충돌은 항상 코드의 같은 라인에서 발생하지만, 그 선이 처음 변수와는 아무 상관이없는, 두 번째 또는 심지어 구조체 A로도.
내 질문은입니다 : '첫 번째'와 '두 번째'를 인스턴스화하고로드하는 방법이 잘못 되었습니까? 그것은로드 기능이 끝난 후 오랫동안 프로그램을 중단 메모리 누수/메모리 오버 플로우의 일종을 일으킬 수 있습니까?
보너스 : 충돌이 다시 발생하면 "file1"과 "file2"를 모두로드하자마자 "file1"만로드하면 충돌이 발생하지 않습니다.
대단히 죄송합니다.
'크기'란 무엇입니까? 두 번째 루프에서 파일을 읽는 중 왜 데이터를 삭제합니까? 왜 한 번에 한 바이트 씩 읽어야합니까? 왜 newA.dataArray 포인터를 덮어 쓰고 (메모리 누수가 생기는가?) –
아, C에서 [malloc의 결과를 캐스팅해서는 안됩니다.] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –
함수를 떠날 때 할당 된 메모리를 비우고 있습니까? – Sathish