2011-12-02 3 views
0

ANSI C 프로그램을 작성 중이며 찾을 수없는 버그가 있습니다. 나는 C에 익숙하지 않으므로 분명하지 않습니다.함수간에 배열을 전달하는 C 디버그

세 파일이 있습니다. 첫 번째는 #include "myheader.h"를 사용하여 다른 두 파일에 포함하는 헤더 파일입니다. 이 헤더 파일에는 다음과 같은 함수 프로토 타입이 있습니다.

double function1(double *, double *, double *, int *, int, int); 

두 번째 파일에는 main() 함수가 있습니다. 이 파일 GDB 사용

int APRON[8] = {1, 2, 3, 4, 5, 6, 7, 8}; 

는 I 관찰 :

(gdb) p APRON 
$1 = {1, 2, 3, 4, 5, 6, 7, 8} 

다음이 배열 인수로 다른 파일 (FILE3)에 전달되는이, 다른 것들 중에서, 가변적 APRON의 선언을 포함 다음 함수 호출 : FILE3에

zz = function1(aa, bb, cc, APRON, dd, ee); 

함수는 다음과 같이 정의된다

,982

(gdb) p bins[0] 
$5 = 1 
(gdb) p bins[1] 
$6 = 2 
(gdb) p bins[2] 
$5 = 3 
(gdb) p bins[3] 
$6 = 4 
(gdb) p bins[4] 
$5 = 5 
(gdb) p bins[5] 
$6 = 6 
(gdb) p bins[6] 
$5 = 7 
(gdb) p bins[7] 
$6 = 8 
: 118,345,563,210

GDB는이 파일 3을 입력하면 나는 즉시 관찰 : 나는 (정말 내가 뭘하는지 모른다) 여기에 서식 주위에 속지 관찰 있지만

(gdb) p bins 
$3 = (int *) 0x7fffffffe390 

gdb가이 배열의 출력을 변경 한 이유는 무엇입니까? 또한, (a 나쁜 방법)에 흥미가 I 참조 :

(gdb) p sizeof(bins) 
$36 = 8 

것이되어야 할 때 8 * 4 = 32 (파일 2에서이 일 때 관찰 됨).

누군가이 파일 3에 들어갈 때이 배열에 어떤 일이 일어나는지 알 수있게 도와 줄 수 있습니까? (왜 그것이 파일로 전달되기 직전과 비교하여 다른 것처럼 보입니까? 3). 스칼라 (dd, ee)가 file3에서 정상적으로 작동하지만 다른 배열 (aa, bb, cc)에서도 동일한 동작을 표시해야합니다.

+0

귀하의 질문은 매우 명확하지 않습니다 같은 것들을 볼 수있는 곳에, DDD을 확인하고,


BTW IMO, 당신의 인생을 훨씬 더 간단 할 것 실제 코드를 게시했지만 배열을 함수에 전달하는 것에 대해 혼란 스럽다고 생각합니다. http://c-faq.com/aryptr/aryptrparam.html 및 http://c-faq.com/aryptr/aryparmsize.html을 참조하십시오. –

+0

APRON은 APRON_TIE와 어떤 관련이 있습니까? 마찬가지로, 쓰레기통은 무엇입니까? 당신은 분명하지 않다. –

답변

1

gdb는 변수 선언 방법에주의를 기울입니다.

첫 번째 파일에서 APRON은 int 배열로 선언됩니다. 따라서 sizeof()는 전체 배열의 크기를 반환하고 gdb의 p 명령은 전체 배열을 표시합니다.

두 번째 파일에서 bins는 int에 대한 포인터로 선언됩니다. int에 대한 포인터의 크기는 8 바이트입니다 (64 비트 시스템을 사용한다고 가정). 포인터의 값을 출력하도록 gdb에 요청하면 16 진수 값이 나타납니다.

그러나 배열의 기본으로 저장소를 사용하고 APRON과 같은 색인을 생성 할 수 있다는 것을 알았 기 때문에 bins [0], bins [1], 쓰레기통 [2], 등등. 당신이보고하는 모든 것은 내가 예상했던 것처럼 소리가납니다.

APRON을 function1()에 전달하면 배열의 주소를 전달하는 것입니다. function1()은 배열의 크기를 전혀 알지 못합니다. 코드가 배열의 길이를 알아야하고 배열의 끝을 지나치게 실행하지 않아야합니다. 그렇지 않으면 배열의 요소 수를 나타내는 function1()에 다른 인수를 포함해야합니다.

+0

Nope, APRON은 int 배열이 아니다. APRON []이 배열을 가지고 있다고 말해야 만했다. –

+0

한 번에 하나의 요소 대신 (예 : 첫 번째 파일에서 수행 된 것처럼) gdb가 전체 배열을 인쇄하도록하는 방법이 있는가? 나는 배열의 길이 인 또 다른 인수를 전달하더라도 gdb가이를 식별하지 못한다고 가정합니다 (또는 그보다 더 지능적입니까?). – ggkmath

+1

gdb에서'p * bins @ 8 '을 시도하십시오. –

1

짧은 대답 : 두 가지 선언이 있기 때문에 GHDB에서 두 가지 다른 동작을 얻습니다.

나는 심지어 int APRON = {1, 2, 3, 4, 5, 6, 7, 8};이 합법적이라고 믿을 수 없다. 그러나 분명히 당신의 코드 compiels는 & 링크이다 (그러나, 직관적이지 않고 쉽게 유지 보수 할 수 없다)).

해당 매개 변수의 함수 프로토 타입은 int *bins입니다.

두 선언의 차이점을 알아 내기보다는 둘 다 int[8]으로 선언하는 것이 어떻습니까?

typedef int apront_t[8]을 만들어 사용하십시오. 그것은 당신이 리눅스에서 개발하는 경우, 당신에게 천국을 당신이 enter image description hereenter image description here

+0

코드를 복사하고 단순화했을 때 오타가있었습니다. 그것은 int APRON [8] = {...}을 읽어야합니다. 나는 위에 교정했다. – ggkmath

+1

에픽 DDD 스크린 샷 +1. :) – unwind

+0

그리고 DDD 팬이되어 당신에게 +1. 그것은 연결 목록을 디버깅 할 때 종종 내 목숨을 구했습니다. 단어를 퍼뜨려 라! – Mawg

관련 문제