2012-03-30 4 views
1

리눅스 장치 드라이버에서 구조체 포인터 사용에 대한 기본적인 질문이 있습니다. 상기 예시 구조 포인터 RTC ISL12022 드라이버 리눅스/드라이버/RTC/RTC-isl12022.c정적 로컬 복사본을 만드는 대신 구조체에 포인터를 사용하십시오.

struct isl12022 *isl12022 = i2c_get_clientdata(client); //From Function static int 
isl12022_set_datetime(struct i2c_client *client, struct rtc_time *tm) 

의 일례를 촬영

대신 함수 copyinto 로컬 생성하는 I2C 클라이언트 데이터를 얻기 위해 사용된다. 대부분 나는 모든 운전자에게 그러한 연습을 보았습니다. 이제는 로컬 복사본을 만드는 대신 구조체 포인터를 사용하는 방법에 대해 알고 싶습니다.

----------------------------------- EDIT ---------- -------------------------------------

멋지게 설명했습니다. 감사. 구조체를 함수 포인터에 전달할 때 사용할 필요가 있습니다. 그러나

isl12022_set_datetime(struct i2c_client *client, struct rtc_time *tm) 

함수에게 i2c_client 구조를 가지고, 상기 RTC-isl12022.c 예를 고려하여 이미 포인터 함수에 전달된다. (그곳)

이제는 isl12022_set_datetime 함수 * 클라이언트 포인터가 로컬 복사본을 만드는 대신 직접 사용 된 다음 실수로 * client가 가리키는 원래 구조가 안전하고 변경되지 않도록 해당 복사본을 사용했습니다.

struct isl12022 isl2022; and then copy the structure pointed as i2c_get_clientdata(client); 

위의 문은 i2c_get_clientdata FN에 의해 ​​반환 isl12022 구조를 가리키는 isl12022 구조 포인터를 생성합니다. 그 distrub 클라이언트가 지적한 원래 datastructure되지 않을까요?

+0

구조체를 복사하는 경우 일반적으로 원래 구조체와 독립적입니다 (다른 데이터에 대한 포인터 (얕은 복사본 대 딥 복사본)가 포함되어 있지 않은 경우) – knittl

답변

0

메모리를 절약합니다. struct에 주소를 전달하는 것은 struct을 복사하는 것보다 훨씬 효율적입니다.

관련 문제