malloc
의 메모리에 사용자 정의 유형에 대한 포인터를 전달하고이 포인터가 포인터를 가리 키도록 설정합니다. malloc()
에는 포인터가 붙어 있지만, 함수에서 돌아 왔을 때, 포인터가 움푹 들어가 있습니다. 포인터 매개 변수가 손상되었습니다. 포인터를 반환하거나 포인터의 주소를 전달합니다.
보다 포인터의 주소를 전달할를 전달하는 대신
- 반환 포인터 : 나는 수정의 몇 함께했다
FILE
포인터; 함수에 포인터를 건네 주면, 시스템이 그 포인터로 도약 할 수 있기 때문에 포인터가 변경되지 않았다고 계산할 수 없습니다. 그래서 대신FILE *
의 주소를 전달합니다.누구든지 설명이 있으십니까? 여기에 (죄송합니다, 그건 조금 긴) 코드의 다음과 같이
//variable declarations INVENTORY *inv = NULL; //process initInventory(inv, bookArySize); processFile(inv);
initInventory()
기능은 다음과 같습니다INVENTORY
은 위와 같이 사용자 정의 유형이typedef struct { BOOK *bookAry; int numBooks; }INVENTORY;
내가
main()
이 있었다 :void initInventory(INVENTORY *inv, int size) { //process inv = (INVENTORY *) malloc(sizeof(INVENTORY)); //more code here.... return; }//initInventory
그래서 우리는 새로 할당 된 메모리를 가리키는
이 그것을 고정 :inv
(그리고로 (우리가 생각하는)main()
로 돌아다른 포인터가있는 구조체를 가리킴). 포인터inv
을processFile()
에 전달할 때만 문제가 발생하고inventory
구조체의 데이터를 참조하려고하면 액세스 위반이 발생합니다.main()
으로 돌아 가면 포인터가 유효하지 않습니다.main()
이 있습니다//variable declarations INVENTORY *inv = NULL; //process inv = initInventory(inv, bookArySize); processFile(inv);
및
initInventory()
이 변경됩니다 :
는 그런 내가 더 나은 수정 생각하는이를 시도했다.INVENTORY * initInventory(INVENTORY *inv, int size) { //process inv = (INVENTORY *) malloc(sizeof(INVENTORY)); //return a pointer to the INVENTORY header struct return inv; }//initInventory
//variable declarations INVENTORY *inv = NULL; //more code here... //process initInventory(&inv, bookArySize); processFile(inv);
을 다음과 같이
initInventory()
은 다음과 같습니다 :main()
지금이void initInventory(INVENTORY **inv, int size) { //process *inv = (INVENTORY *) malloc(sizeof(INVENTORY)); //more code here.... return; }//initInventory
C의 인수는 항상 값의 모든 유형의 매개 변수에 의해 전달됩니다. 그래서'inv'를 넘길 때'inv'의 값, 즉'NULL'을 넘깁니다. 그런 다음, 함수 내에서 그 값은 * local *'inv' 변수에 할당됩니다.이 변수는 여러분의 마음 내용에서 변경할 수 있습니다. – pmg