C언어 전역 구조체 변수 대입
글쓴이: mirth81 / 작성시간: 토, 2008/08/16 - 3:47오전
C언어에서 구조체를 사용하려고 하는데 일반 변수하고 다르게 동작하는 부분이있어서 질문올립니다.
struct S { int a; } s1; struct comp { int a; struct comp* next; } s2; int i; void foo() { i = 10; s1.a = 10; s2.a = 10; }
이렇게 식을 쓰면 함수 호출이 끝나면 i와 s1.a는 값이 그대로 10으로 유지되는데 s2는 0으로 돌아가버리네요.
첨엔 모든 구조체가 이런가보다 했는데 포인터를 가지지 않는 간단한 구조체(s1)은 되고 그렇지 않은 경우(s2)는 안 되네요. 전역 변수라 그냥 사용하면 될줄알았는데, 왜 이런거죠?
그런데, s2를 static으로 주면 되긴합니다. 제가 c#에서 바로 넘어와서 좀 헷갈리는데, s2가 static인 경우하고 아닌 경우 둘다 유효 범위는 같아보이는데 이 차이점도 아시는분 답변부탁드릴께여
gcc 4.3.1 쓰고있는데 gcc문제는 아니겠죠.
Forums:
정말로 소스가 저게
정말로 소스가 저게 다인건가요? 다른데서 건드리고 있는건 아닌지요...?
방금 테스트해봤는데 문제없던데요.
테스트코드
[geshifilter-code]#include <stdio.h> struct S { int a; } s1; struct comp { int a; struct comp* next; } s2; int i; void foo() { i = 10; s1.a = 10; s2.a = 10; } int main() { foo(); printf("%d %d %d\n", i, s1.a, s2.a); return 0; }
[/geshifilter-code]실행 결과: 10 10 10
gcc 버전: 4.2.3
주변의 변수 초기화때문에
지금 제가 시뮬레이션을 만들고있는데요, 사용할 변수들이 많아서 전역 변수로
double *queueA, *queueB;
이런식으로 선언하고
foo()의 마지막 부분에서
memset(&queueA, 0, sizeof(double)*QueueLengthA);
이렇게 했더니 다른 변수들이 0으로 나오는거 같네요
저는 문제를 간략하게 보이려고 줄인거였는데, 첨에 질문으로 사용한 예제는 문제가 없네요.
답변글에 된다길래 똑같이 써보니 되네요. --;
저는 queueA를 double 배열로 만들고 싶었는데
const A;
double queueA[A];
이렇게 하니깐 오류뜨길래 (C99에서 가변크기 배열된다길래 썼더니 자동 변수만 되는거 같더라구요)
double *queueA 하고 초기화 한답시고 memset썼던게 문제네요.
이때는 queueA = malloc(sizeof(double)*queueSize);
이렇게 하면 부작용없이 되려나;;
밤샌게 허무하네요 ㅠㅠ
댓글 달기