2012-03-28 2 views
0

나는이 방법을 사용하고 있습니다.
stringcontent.h 파일에 char 배열을 정의했으며이 배열은 다른 파일 test.c의 메서드에서 가져옵니다.C의 다른 파일에서 배열 가져 오기

나는이 방법 인터페이스 (기능 서명)를 고수해야하고 어떻게 해결할 수 있습니까?

+2

"stringcontent.h"라는 코드는 실제로 "stringcontent.c"이어야합니다. "stringcontent.h"에서'void get_char_array (int, char * buffer);'만 선언해야합니다. 그렇게하지 않으면 링커 오류가 발생합니다. @ rbelli의 응답이 필요한 것 같아서 응답을 편집 할 수있는 자유를 얻었습니다. – j4x

+0

@ D-Shan : 주제에서 벗어나지 만 귀하의 아바타를 발견하고 전적으로 동의합니다. – cHao

+0

@cHao 네가 너무. – Dinushan

답변

3

내가 이해하면 get_char_array 함수를 사용하여 변수를 가져 오려고합니다. 난 당신이 다음을 수행 할 필요가 이해한다면 그런 (숯불에 포인터에 대한 포인터를받을 수 get_char_function 변경) :

// stringcontent.h 
char content1[] = "blahblah"; 
void get_char_array(int which,char **buffer){ 
    if(which == 1) 
     *buffer = content1; 
     printf("%s",*buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
main(){ 
    char *buf; 
    get_char_array(1,&buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

편집 :

는 헤더 파일에 선언을를 넣어 및 구현 ".c"또는 링커 오류가 발생합니다.

// stringcontent.h 
#ifndef __STRINGCONTENT_H 
# define __STRINGCONTENT_H 

void get_char_array(int which,char **buffer); 

#endif 

// stringcontent.c 
char content1[] = "blahblah"; 
void get_char_array(int which,char **buffer){ 
    if(which == 1) 
     *buffer = content1; 
     printf("%s",*buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
main(){ 
    char *buf; 
    get_char_array(1,&buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

은 (GCC를 사용하는 경우) 컴파일하려면 :

gcc -Wall test.c stringcontent.c -o test 

참고하면, 포인터를 필요로하는 유일한 이후 "수출"content1에, 함수에 의해 반환되는 필요가 없습니다.



여기 strcpy를 사용하여 다른 해결책이다. 이 경우 포인터에 포인터를 전달할 필요가 없습니다.

// stringcontent.h 
char content1[] = "blahblah"; 
void get_char_array(int which,char *buffer){ 
    if(which == 1) 
     strcpy(buffer,content1); 
     printf("%s",buffer); // prints : "blahblah" 
    // and so on..... 
} 

// test.c 
#include "stringcontent.h" 
#define GOOD_SIZE (100) 
main(){ 
    char buf[GOOD_SIZE]; 
    get_char_array(1,buf); 
    printf("%s",buf); // prints "blahblah" !!! 
} 

이 경우 get_char_array를 호출하기 전에 buf에서 충분한 크기를 할당해야합니다.

저는 첫 번째 솔루션을 선호합니다. strcpy를 사용할 필요가 없습니다. buf에 충분한 공간을 할당하지 않으면 문제가 발생할 수 있습니다. 한 가지 해결책은 함수에서 buf의 크기를 전달하고 strcpy 전에 확인하거나 strncpy를 사용하는 것입니다.

+0

당신의 솔루션은 완벽하게 작동합니다. 그러나 여기서 메소드는 (1, ** buf **)가 아니라 like (1, ** & buf **)라고 불린다. 그 방법이 가능할까요? – Dinushan

+1

예,이 경우 포인터를 수정할 때 포인터의 주소를 전달해야합니다. – rbelli

+0

나는 (1, ** buf **)와 같이 호출 할 수있는 방법이 있지만 (1, ** & buf **)는 좋지 않다는 것을 의미합니다. "내가이 메소드 인터페이스를 고수해야합니다." – Dinushan

0

사용 :

extern char content1[]; 

선언 stringcontent.hstringcontent.c라는 이름의 파일에 배열 정의 및 함수 정의를 넣어. 객체 파일과 함수 정의를 헤더 파일에 넣으면 안됩니다.

관련 문제