2013-04-01 3 views
1

최근 응용 프로그램을 개발하는 동안 매우 이상한 segfault가 발생했습니다. 기본적으로, 내 구조체 중 하나에 다른 변수를 추가하면 명백한 이유없이 실행시 segfault가 발생합니다. 이 변수를 제거하면 즉시 문제가 해결됩니다. 다음과 같이 구조체는 다음과 같습니다구조체 내부에서 변수를 선언 할 때 분할 오류가 발생했습니다.

typedef struct Note { 
    char cNote; 
    unsigned int uiDuration; 
    unsigned int uiVelocity; 
}; 

마자 구조체에 어디서든

long lStartTime; 

변수를 추가, 코드는 정상적으로 컴파일하지만 세그먼트 오류가 발생합니다. GDB의 역 추적 (backtrace)은 내가 사용하지 않는 일부 WIN 메소드에서 사라졌습니다.

아이디어가 있으십니까?

감사합니다.

+4

어딘가에 정의되지 않은 동작이 있습니다. 이 멤버를 추가하는 것만으로 더 분명 해지고 있습니다. 수동 메모리 관리 나 배열 접근과 관련된'Note'와 관련된 일을하십니까? 거기서보기 시작하십시오. –

+0

Joseph의 의견에 약간의 설명을 덧붙이면, 어떤 코드는 메모리 관리 나 배열 접근에 문제가있는 것은 아니지만 'Note'와는 아무런 관계가 없습니다. 정의되지 않은 동작의 즐거움 중 하나는 완전히 관련없는 코드를 편집 할 때 증상이 변경 될 수 있다는 것입니다. – Peter

답변

2

나는 몇 가지 가능한 설명을 참조하십시오

  1. 뭔가 어딘가에 struct가 특정 크기의 것으로 가정합니다. 크기 변경은 물건을 부순다.
  2. 메모리에있는 것들의 레이아웃을 변경하여 표면에 나타나는 일종의 메모리 버그가있을 수 있습니다. valgrind 또는 Purify와 같은 도구를 사용해보십시오.
  3. 헤더 파일에서 struct을 변경하려고하지만 struct을 사용하는 모든 원본 파일을 다시 작성하지 못하고 있습니다.
+0

valgrind 외에도 Electric Fence 및 (Windows 전용) App Verifier가 있습니다. –

+0

모두에게 도움을 주셔서 감사합니다. 그러나 나는 그것을 알아 냈습니다. 나는 다른 클래스 안에 정적으로'Note's로 구성된 커다란 배열을 할당했다. 나는 프로그램의 스택이'Note'의 많은 인스턴스를 보유하기에 충분히 크지 않기 때문에이 작업을 동적으로 수행해야합니다. 구조체에 변수를 추가하면 스택 오버플로가 발생하기 때문에 매우 아이러니합니다. 웹 사이트 제목 LOL을 살펴 보았어야합니다. – Pickle

관련 문제