2014-07-11 8 views
0

변수에 배열 요소의 값이 할당되는 방법에 대한 간단한 질문. 내 코드가 최소한의 메모리를 사용하는지 확인하려고합니다.배열 요소에 C 변수 할당

미리 정의 된 구조체 배열이 있고 배열의 한 요소에 대한 참조를 만들려는 경우 변수를 값과 반대로 참조로 전달하도록하려면 어떻게해야합니까? 이 문제를 해결하기 위해 검색했지만 아마도 검색 문자열이 필요하지 않습니다. 다음과 같이

#myfile.h 
typedef struct { 
    uint8_t abba; 
    uint8_t zabba; 
} mystruct; 

extern mystruct mystructs[2]; 

#myfile.c 
mystruct mystructs[2] = { 
    {.abba=0,.zabba=1}, 
    {.abba=2,.zabba=3} 
}; 

void myfunc1() { 
    mystruct ms1 = mystructs[1]; 
    printf("%d", ms1.abba); 
    ms1.zabba = 5; 
} 

void myfunc2() { 
    printf("%d", mystructs[1].abba); 
    mystructs[1].zabba = 5; 
} 

예를

에 대한

그래서 내 질문은 : 나는 myfunc1의 MS1을 만들 때 , 그것은 mystructs 단지 참조 [1]? 또는 ms1에 요소를 복사합니까?

myfunc1과 myfunc2는 메모리 사용시 동일한 결과를 나타 냅니까?

ms1.zabba = 5 실제로 mystructs [1] .zabba를 업데이트 할 예정입니까?

+0

나는 Peter Schneider와 Quentin의 답변을 모두 수락 할 수 있습니다. Peter는 어떻게 작동하는지 자세히 설명하고, Quentin은 ms1을 포인터로 만드는 예제를 제공합니다. – user3817250

답변

2

내가 myfunc1의 MS1을 생성, 그것은 mystructs 단지 참조입니다 [1]?

아니요, 사본입니다.

또는 ms1에 요소를 복사합니까?

예.

myfunc1과 myfunc2는 메모리 사용시 동일한 결과를 나타 냅니까?

번호 (더 정교한 될하려면 myfunc1 타입 MYSTRUCT의 로컬 객체를 생성() "스택에"; 기능 모두를 떠난 후 그래서 해에서 수행 된 구조체는 큰되지 않습니다, 이전 돌아왔다. 그래서 문제는.의 PC에 당신은 큰 (매크로 블럭) 것들 비싸거나 (예를 들어, 소켓 연결)에 문제를 얻을 수 있습니다.)

은 = 5 실제로 mystructs [1] .zabba를 업데이트 ms1.zabba 것인가?

아니요, ms1은 사본이므로 아닙니다.

포인터 또는 참조를 사용할 수 있습니다.

2

사본입니다. 당신은 실제로 원격 구조체 수정 포인터를 사용해야합니다

void myfunc1() { 
    mystruct *ms1 = &mystructs[1]; 
    printf("%d", ms1->abba); 
    ms1->zabba = 5; 
} 
+0

처음에는이 코드를 시도했지만 경고 메시지가 나타납니다. "# 145-D"const mystruct * "유형의 값을 사용하여"mystruct * "유형의 엔티티를 초기화 할 수 없으므로 잘못된 결과가 발생했다고 가정 했으므로 코드가 컴파일되고 예상대로 실행되는 것으로 보입니다 – user3817250

+0

경고는 다음과 같습니다. 가볍게 생각하지 말라. 그러나 당신의 질문에 'mystructs'는 'const'라고 언급되어 있지 않다 ... – Quentin

+0

Quentin이 말한 것은 사실이며 경고는 일어나지 않아야한다. 작은 작업 예제를 만들려고하면 컴파일러 메시지를 위해 main()이 필요합니다!) 우리는 그것이 어디에서 왔는지 알 수 있습니다. 아마도 분명합니다. –