malloc 및 무료 사용에 대해 혼란 스럽습니다. 여기에 내 예제와 코드가 있습니다.
명확하게하기 위해 파일에서 행을 읽고 배열에 쓰고 싶다고 가정합니다. 파일 형식은 다음과 같습니다.
3
abc
def
ghi
jkl
mno
pqr
처음 세 줄은 array1에 저장하고 나머지는 array2에 저장하고 싶습니다.
코드:
int num;
FILE *fin = fopen("filename", "r");
/*Read the first line of the file*/
fscanf (fin, "%d", &num);
char **array1 = malloc(sizeof(char *) * num);
char **array2 = malloc(sizeof(char *) * num);
/*Apply sizeof(num * num) memory blocks and set the first address to array1[0]*/
array1[0] = malloc(sizeof(char) * num * num);
array2[0] = malloc(sizeof(char) * num * num);
/*Allocate the address of each (char *) array pointer*/
int i;
for (i = 0; i < num-1; i++)
{
array1[i+1] = array1[i] + num;
}
for (i = 0; i < num; i++)
{
fscanf(fin, "%s", array1[i]);
}
free
함수를 호출 할 때 문제가 발생 합니다.
/*ERROR: free(): invalid next size (fast): 0x0804b318(gdb)*/
free(array1[0]);
free(array1);
주소 0x0804b318이 array1 [0]이므로 할당 된 메모리 블록이 충분하지 않을 수 있습니다. 더 크게 만들려면 :
array1[0] = malloc(sizeof(char) * (num+1) * (num+1));
그리고 그것은 효과가 있었지만 파일의 처음 세 줄이 다음과 같기 때문에 이것에 대해 혼란 스럽습니다.
abc
def
ghi
이 malloc
함수는
3 개의 줄 을 저장 하기에 충분한 3 * 3 문자 배열에 대한 포인터를 반환합니다 . 왜 (3 + 1) * (3 + 1)이 필요한가요?
문자열은 종료 '\0'
문자 와 함께 저장 되며 공간도 차지합니다. 따라서 3 자 문자열을 저장하려면 4 자용 공백이 필요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다