|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


3198, 1/160 |
![]() |
![]() |
![]() |
![]() |
|
영원한공부 | ||||||
|
[C언어] 열혈강의 C 마지막 문제 질문이요. | ||||||
|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3055 [복사]
Hit : 7771 Date : 2011/06/13 04:45
|
|||||||
| ![]() |
| |
| profreez | realloc 하신다음에 새로 할당된 공간를 초기화 해주세요. man[새로 할당된 공간].use = 0; // 이걸넣어야 겠죠.. |
2011/06/13 | |
| 영원한공부 | profreez// 그렇게 해도 달라지는게 없네요... 문제가 되는게 4번째 입력 후에 건드리지 않은 1, 2 ,3 번째 데이터까지 변형이 생기는 거인데 이건 해결이 안 되네요 |
2011/06/14 | |
| prosthetics | 이 코드에서 볼 수 있는 오류는 포인터 매개변수네요. <1 : realloc> http://blog.naver.com/neutrino37?Redirect=Log&logNo=110005927328 위 사이트에 가보시면 realloc에 대해 자세히 설명이 나와있습니다. 요약하면, 보통 확장할때(realloc)는 위치가 바뀐다고 합니다. 즉, 재할당한 메모리 주소가 이전 메모리 주소랑 다르다는... ->man=(Inform *)realloc( man, sizeof(Inform) * (size+=3) ); ->man의 본래의 값이 realloc이 반환한 주소로 바뀜. <2: 매개변수> Prototype : insert(Inform * man), 호출(main) : insert(man); ->메인의 man이 가리키는 주소가 insert함수의 man으로 이동 ->insert함수 내에서 어떤짓을 해도 main의 man의 값은 바뀌지 않음 <3: 결론> <1>에서 말한것처럼 realloc은 메모리를 더 큰 것으로 바꿔줍니다. 이 과정에서 월래 있던 메모리가 free될것으로 예상됩니다. (제 생각에는요.) 그리고 insert의 man값은 확장된 새로운 주소를 가리키게 되곘지요. 하지만 <2>에서 말한 대로 main의 man값은 free된(아마) 주소를 가리키고 있을 것이고 insert함수의 man은 함수가 종료되면서 증발되겠지요. 따라서, main의 man -> 쓰레기 주소 가리킴 inset의 man -> 확장할 때 제대로된 주소 가리켯다가 함수 종료하며 증발 <4: 오류해결방법> 매개변수를 insert(Inform ** man)과 같이 고쳐주시고 호출부분에서 insert(&man); insert함수 내에서 *man = ...realloc(...); <5: 의견> 저는 연결리스트를 이용하기 때문에 realloc은 자주 사옹해 보지 않은 지라, <3>에서 free한다는 말은 가정일 뿐입니다. 또한 여기 나온 코드만 보고는 완벽한 답변을 드릴수가 없군요. 풀코드를 주시면 자세한 분석을 해드리겠지만... |
2011/06/14 | |
| 영원한공부 | prosthetics// 완벽한 답변이었어요. 감사합니다. 제가 여려가지 확인해본 결과 Insert함수만의 문제 같아서 이것만 올린거였어요. 포인터 man은 main함수에서 선언된 지역변수이고 님의 설명대로 고쳤더니 제대로 결과 나왔어요 감사합니다. 그리고 이 방법은 제가 처음 생각했던 방법인데 친구가 열결리스트를 알려줘서 연결리스트로 풀었다가 나중에 제가 생각했던 방법으로 다시 풀어봤는데 이렇게 됐네요. |
2011/06/14 | |
|
|