2009-08-03 4 views
3

한 라인에 구조체의 배열의 모든 값을 변경C 나는 구조 선언 할 수

test_t theTest[2] = 
{ 
    {1,2,3}, 
    {4,5,6} 
}; 

을하지만, 배열을 만든 후에 루프없이 모든 값을 명시 적으로 지정하여 한 줄만 사용하여 위에서 설명한 것과 같은 방식으로 값을 변경할 수 있습니까?

답변

8

는 C99에서 당신은 한 줄의 각 구조를 할당 할 수 있습니다. 당신이 한 줄에 구조체의 배열을 할당 할 수 있다고 생각하지 않습니다.

C99에서는 복합 리터럴을 사용합니다. The New C: Compound Literals

theTest[0] = (test_t){7,8,9}; 
theTest[1] = (test_t){10,11,12}; 

당신은이 같은 포인터에 할당 할 수 있습니다 :

test_t* p; 
p = (test_t [2]){ {7,8,9}, {10,11,12} }; 

당신은뿐만 아니라 방어 적이기을 사용할 수

memcpy(theTest, (test_t [2]){ {7,8,9}, {10,11,12} }, sizeof(test_t [2]); 

테스트보다도 여기 박사 돕 스는 문서를 참조하십시오 gcc -std = c99 (버전 4.2.4) (Linux)

복합 리터럴이 작동하는 방식을 이해하려면 Dr. Dobbs 문서를 읽어야합니다.

+0

나는 이것들을 조합하여 작동하는지 확인해 볼 것입니다. –

+0

그걸로, 당신은 할당 루프에 대한 매크로를 만들 수 있습니다. 그렇게하면 재사용이 쉽고 청소가 쉽습니다. – Loki

+0

+1은 C89가 할 수 있음에도 불구하고 C99이 할 수 있음을 알고 있기 때문에 +1합니다. –

0

나는이 방법으로 초기화 배열 만 할 수 있다고 생각하지 않습니다. '단선'방법을 사용하여 구조 값을 변경할 수 있습니다.

+0

'값을 변경할 수 없음'을 의미 했습니까? C99을 언급하는 대답도 참조하십시오. –

+0

죄송합니다. 저는 -c99 만 사용하고 그 사실을 언급하지 않았습니다. 나는 종종이 기능을 사용한다 : "theTest [0] = (test_t) {7,8,9};" – f0b0s

0

변수가 다른 소스에서 복사되는 경우 memcpy와 같은 메서드를 사용하여 구조체 값을 직접 덮어 쓸 수 있습니다.

그러나 언어는 개별 요소를 설정하는 것 외에 값을 설정하는 직접적인 방법을 제공하지 않습니다. 경우

+0

C99에 대해 잊어 버렸습니다. –

1

당신은 제로 (-1), 사용할 수 memset에 값을 설정하려면 :

memset(struct_array, 0, sizeof(struct_array)); 
memset(struct_array, -1, sizeof(struct_array)); 
+0

사실이지만 아주 완전하지는 않습니다. 당신은 C99에 대해 잊어 버렸습니다. –

+0

방금 ​​문제의 일반적인 경우에 대한 대체 방법으로이 문제를 언급했습니다. 나는 그것이 완전한 문제를 해결한다고 주장하지 않았다. –

관련 문제