2010-11-21 2 views
0
gcc 4.5.1 c89 

나는 다음과 같은 구조의 요소를 할당하는 기능을 가지고 :함수에 오류가 있으면 무엇을 반환할까요?

static struct Config_t { 
    char protocol[LINE_SIZE]; 
    char mode[LINE_SIZE]; 
} *app_config = NULL; 

할당하고 메모리를 취소 malloc에와 memset 함수를 사용하는 함수입니다. 여기

char* get_mode() 
{ 
    if(app_config->mode != NULL) { 
     return app_config->mode; 
    } 
    return NULL; 
} 

나는 값이 할당되어 있는지 확인하고 : 그 작업이 완료되면

, 나는 개별 요소를 가져옵니다 기능을 가지고 있습니다. 그렇지 않은 경우 NULL을 반환합니다. 따라서 호출 함수에서 NULL이 반환되는지 확인할 수 있습니다. 그러나, 이것을 할 수있는 더 좋은 방법이 있다면? 당신이 좋은 모양에있어, 그래서 오류 조건에 대한 NULL를 반환 제안에 대한

많은 감사를, C에서

+3

나는 C에서 벗어났다. 그러나'mode'는'NULL'이 될 수 없다, 그렇지? 'app_config'는 확실히 NULL 일 수 있지만,'mode'는 포인터가 아니라 구조체의 본질적인 부분 인 배열로 정의됩니다. 당신은 구조체를 가지거나 갖지 않을 것이다. 그러나 당신은 struct의 * ​​part *를 가지지 않을 것이다. 'mode'가'char * mode'로 정의 되었다면, 그것은 다를 것입니다. –

+2

그냥'return app_config-> mode; '모드를 체크하지 않고 리턴한다. – khachik

+0

@ T.J Mode는 배열입니다. 그러나 그것은 포인터로 붕괴 될 것입니다. 모드 요소에 값이 지정되지 않은 경우 반환 할 내용이 궁금합니다. 감사. – ant2009

답변

3

는 포인터를 리턴하는 함수의 표준 방법입니다. 별도로


(. 포인터를 반환하지 않는 함수의 경우, 일반적인 규칙은 성공과 오류에 0이 아닌 에러 코드에 0를 반환하는 것입니다), 그리고 아마도 약간 오프 주제 : mode 캔 ' 하지만 NULL이 되겠습니까? app_config은 확실히 NULL 일 수 있습니다. 구조체에 대한 포인터이지만, mode은 포인터가 아니라 구조체의 내장 부분 인 배열로 정의됩니다. 당신은 구조체를 가지거나 가지지 만 구조체의 부분은이되지 않습니다. 단순히 구조체의 메모리를 할당하면 modeLINE_SIZE 문자가 할당됩니다. 사실 sizeof(struct Config_t) == LINE_SIZE + LINE_SIZE 인 경우 구조 이고 다른 문자 배열이 뒤에 오는 문자 배열입니다. 관련된 포인터가 없습니다 (구조에 대한 포인터로 정의했기 때문에 app_config 제외). 따라서

이 완전히 struct Config_t, 그냥 이렇게 할당 :

app_config = malloc(sizeof(*app_config)); 

(. 또는 app_config = malloc(sizeof(struct Config_t));이 플랫폼 위를 허용하지 않을 경우) 그 mode를 할당, 아무것도 다른 필요하지 않습니다. modechar *로 정의 된

경우, 즉 다른 것 :

static struct Config_t { 
    char *protocol; 
    char *mode; 
} *app_config = NULL; 

지금 sizeof(struct Config_t) == 2 * sizeof(void*) (아래 참조), 구조 자체는 두 포인터로 구성되어, 그들이 가리 수없는 데이터. 구조를 할당하면 이 아닌에 해당 공간이 할당됩니다.

#include <stdio.h> 

#define LINE_SIZE (200) 

struct Config_t { 
    char protocol[LINE_SIZE]; 
    char mode[LINE_SIZE]; 
}; 
struct Config_t_with_pointers { 
    char *protocol; 
    char *mode; 
}; 

int main(int argc, char* argv[]) 
{ 
    printf("sizeof(struct Config_t) = %zu\n", sizeof(struct Config_t)); 
    printf("sizeof(struct Config_t_with_pointers) = %zu\n", sizeof(struct Config_t_with_pointers)); 
    return 0; 
} 

는 (컴파일러 감안할 때, 나는 최근 GCC는 그것을 가지고 같이하고는 C99 표준에있어, 마태 복음은 우리에게 알려줍니다, size_t 인수에 대한 z 형식 지정자를 사용하여 무료로 느꼈다.)

출력 (내 64 비트 리눅스 시스템)에 : 등 (수록, C 기능 내장의 정의)를 기반으로

sizeof(struct Config_t) = 400 
sizeof(struct Config_t_with_pointers) = 16
+0

T. J. 위의 의견이 정확하므로 여기에서 언급하겠습니다. 유효한'Config_t'를 가질 때마다 그 안에 모드 배열이 있습니다. –

+0

@Matthew : 감사합니다; 끝난. –

+0

J.,'size_t'는 표준 C (C99)입니다. –

1

, NULL을 반환하는 것을를 표시 할 수있는 이상적인 방법입니다 그것은 배정이나 배정을 할 수 없었습니다.

+4

'gets'는 API 디자인을위한 훌륭한 역할 모델이 아닙니다. –

+0

@Matthew : LOL !! –

+0

나는 당신이 그것을 언급하자마자 그것을 깨닫는다. 나는 가져 오기가 그것에 많은 단점을 가지고 있다고 생각한다? 내 말은, 일부 C 컴파일러에서는 gets()가 위험한 함수라는 경고를 받는다는 것입니다. :) –

1

글쎄, 유일한 이유는 값이 지정되지 않은 경우 하나이기 때문에 둘 이상의 값을 구별 할 필요가 없습니다. 또한 NULL은 유효한 포인터가 아니므로 잘못된 것이 없습니다.

오류가 더 많이 발생하면 errno.h를 사용하면됩니다.

관련 문제