는 포인터를 리턴하는 함수의 표준 방법입니다. 별도로
(. 포인터를 반환하지 않는 함수의 경우, 일반적인 규칙은 성공과 오류에 0이 아닌 에러 코드에 0
를 반환하는 것입니다), 그리고 아마도 약간 오프 주제 : mode
캔 ' 하지만 NULL
이 되겠습니까? app_config
은 확실히 NULL
일 수 있습니다. 구조체에 대한 포인터이지만, mode
은 포인터가 아니라 구조체의 내장 부분 인 배열로 정의됩니다. 당신은 구조체를 가지거나 가지지 만 구조체의 부분은이되지 않습니다. 단순히 구조체의 메모리를 할당하면 mode
에 LINE_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
를 할당, 아무것도 다른 필요하지 않습니다. mode
이 char *
로 정의 된
경우, 즉 다른 것 :
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
나는 C에서 벗어났다. 그러나'mode'는'NULL'이 될 수 없다, 그렇지? 'app_config'는 확실히 NULL 일 수 있지만,'mode'는 포인터가 아니라 구조체의 본질적인 부분 인 배열로 정의됩니다. 당신은 구조체를 가지거나 갖지 않을 것이다. 그러나 당신은 struct의 * part *를 가지지 않을 것이다. 'mode'가'char * mode'로 정의 되었다면, 그것은 다를 것입니다. –
그냥'return app_config-> mode; '모드를 체크하지 않고 리턴한다. – khachik
@ T.J Mode는 배열입니다. 그러나 그것은 포인터로 붕괴 될 것입니다. 모드 요소에 값이 지정되지 않은 경우 반환 할 내용이 궁금합니다. 감사. – ant2009