그것이 가능하면 초기화인터 NULL?

나는이 같은 것을 작성

char *x=NULL;

는 가정

 char *x=2;

을 만들 것char포인터 주소 2.

하지만,The GNU C 프로그래밍 자int*my_int_ptr=2;매장 정수 값이"2"이 무엇이든 임의의 주소는my_int_ptr때 할당됩니다.

이는 것을 의미하는 내 자신의char*x=NULL는 할당하여 최상의 값을NULL캐스팅char는 일부를 임의의 주소로 메모리에 있습니다.

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char *x=NULL;

    if (x==NULL)
        printf("is NULL\n");

    return EXIT_SUCCESS;
}

는,사실에,인쇄

NULL

때 나는 컴파일과 실행에 대해 염려가는 나에 의지는 정의되지 않은 동,또는 적어도에서 지정된 행동을,그리고 작성

char *x;
x=NULL;

대신 합니다.

질문에 대한 의견 (18)
해결책

Is 가능한 초기화인터 NULL?

TL;DRYes,very much.


실제적인 주장 가이드읽 like

_On 다른 한편으로는,당신이 사용하는 경우 단지 하나의 초기 할당,int*my_int_ptr=2;,프로그램을 채우기 위해 노력할 것입니다 내용을 메모리의 위치가 가리키는my_int_ptr값을 가진 2. 이후my_int_ptr가 가득한 쓰레기,그것은 될 수 있다는 어떤 주소입니다. [...]_

글쎄,그들은잘못된습니다,당신은 맞습니다.

문,(ignoring,지금은,사실에는 포인터를 정수의 변환은 구현 시 정의 behaviour)

int * my_int_ptr = 2;

my_int_ptr은 변수(유형의 포인터int),그것은 주소를 가지고 있는 자신의(유형:주소의 포인터를 정수)에 있는 저장하는 값이2that 주소입니다.

이제,my_int_ptr,되는 포인터 형식,우리가 말할 수있는,그것은 _points 를 값"유형"에는 메모리 위치 pointed by 값에서 개최된my_int_ptr. 그래서,당신은 기본적으로 할당하여 값 of 포인터 변수의 값이 아니라 메모리의 위치가 가리키는 포인터이다.

그래서에 대한 결론

 char *x=NULL;

초기화한 포인터 변수이xNULL,지 value 에는 메모리 주소를 가리키는 pointer_.

이것은

 char *x;
 x = NULL;    

Expansion:

지금 엄격하게 따르는,다음과 같은 문을

 int * my_int_ptr = 2;

는 불법적으로 포함한 제약 조건을 위반입니다. 할 명확하고,

-my_int_ptr포인터 변수,유형int* -정수 상수로,2유형int,에 의해 정의합니다.

그리고 그들은하지 않"와 호환"유형,그래서 이 초기화가 잘못되었기 때문에 그것이's 의 규정을 위반하는 간단한 할당,장에서 설명하는§6.5.16.1/P1 에서 설명하는[Lundin's답변.

경우에 사람이's 이 관심있는 방법을 초기화가 연결이 간단한 과제의 제약을 인용C11,chapter§6.7.9,P11

의 이니셜라이저 스칼라이 될 것이며 단일 식 선택적으로 중괄호로 묶여 있습니다. 이 초기 값의 개체의 표현이(후 변환);같은 타입 제약 및 변환을 위한 간단한 과제에 적용,그의 형식은 스칼라 이 될 자격이 없는 버전의 선형입니다.

해설 (6)

튜토리얼은 잘못된 것입니다. ISO C,int*my_int_ptr=2;는오류가 있습니다. 에 GNU C,그 의미와 같int*my_int_ptr=(int*)2;. 이로 변환합니다 정수2메모리 주소,일부 패션에 의해 결정되는 컴파일러입니다.

하지 않습니다 아무것도 저장에 위치하여 해결하는 주소는(있다면). 는 경우에*my_int_ptr=5;,그리고 그것을 저장하는 것을 시도하십시오 숫자5에 위치하여 해결하는 주소입니다.

해설 (3)

는 이유를 설명하기 위해서,잘못된int*my_int_ptr=2;은"제약 조건을 위반",그것은 코드는 허용되지 않을 컴파일하고 컴파일을 제공해야 합 진단에 따라 발생한다.

당 6.5.16.1 간단한 지정:

제약 조건

다음 중 하나를 개최하여야 한:

-왼쪽 연산자는 원자,자격,또는 비정규산 유형,그리고 오른쪽에는 연산 유형 -왼쪽 연산자는 원자,자격,또는 자격이 없는 버전의 구조나 조합형과 호환되는 유형의 오른쪽; -왼쪽 연산자는 원자,자격,또는 자격이 없는 포인터 타입과(고려하는 유형의 왼쪽 연산자가 후 lvalue 변환)피연산자를 모두 포 자격 또는 무자격 버전의 호환되는 형식,그리고 유형에 의해 지정된 왼쪽가 모든 규정의 형식을 지적하여 오른쪽; -왼쪽 연산자는 원자,자격,또는 자격이 없는 포인터 타입과(고려하는 유형의 왼쪽 연산자가 후 lvalue 변환)하나 피연산자가 개체에 대한 포인터 타입이고,다른 를 가리키는 포인터 또는 자격을 갖춘 자격이 없는 버전의 무효과 유형에 의해 지정된 왼쪽에 있는 모든 규정의 지적 유형 하여 오른쪽; -왼쪽 연산자는 원자,자격,또는 자격이 없는 포인터를 오른쪽 null 포인터이 일정한다;또는 -왼쪽 연산자는 유형 원자,자격,또는 자격이 없는 _Bool,그리고 오른쪽은 포인터이다.

이 경우에는 왼쪽 연산자입니다 자격이 없는 포인터이다. 데도 그것을 언급된 권리 연산자입할 수 있는 정수(연산 타입)으로 구성되어 있습니다. 그래서 코드에 위배되 C 표준입니다.

GCC 가려 제대로 작동하지 않는 한 당신이 명시적으로 말할 수 있는 표준 C 컴파일러입니다. 는 경우에 당신은 코드를 컴파일을-std=c11-현학적 오류,그것이 올바르게 제공한 진단으로 수행해야합니다.

해설 (7)

int*my_int_ptr=2

장 정수 값 2 어떤 임의의 주소는 my_int_ptr 때 할당됩니다.

이는 완전히 잘못된 것입니다. 는 경우에 이것은 실제로 기록한 다음을하시기 바랍 더 나은 책이나습니다.

int*my_int_ptr=2정의의 정수 포인터는 주소 2. 당신이 가장 가능성이 충돌이 발생하는 경우에 당신은에 액세스하려 주는2.

*my_int_ptr=2,즉없이int에서 라인,저장 값은 두 개의 무엇을 임의의 주소는my_int_ptr가리키고 있습니다. 는 이 말에 할당할 수 있습NULL을 때 포인터가 그것이 정의됩니다.char*x=NULL;완벽하게 유효한 C.

편집:이것을 쓰는 동안 나는't 알고 있는 정수 포인터변환 구현입 정의된 동작입니다. 참조하시기 바랍에 좋은 답변 by@M.M@SouravGhosh 자세한 내용은.

해설 (2)

많은 혼란에 대 C 점에서 아주 나쁜 선택하는가 원래 만들어 코딩에 대한 스타일을 뒷받침하여 아주 나쁜 작은 곳에서는 언어의 문법.

int*x=NULL;사를 진행하고 있습니다.C,그러나 그것을 아주 잘못된 내가 말할 것 무의미하며,그것은 방해 언어의 이해를 위한 많은 초보자. 그것은 하나의 생각에는 우리가 할 수 있는x=NULL;는 물론 불가능합니다. 당신이 볼 입력되지 않은 변수의int,그리고 변수의 이름은x,또는*선언에서 어떤 기능적 역할을 공동으로=`. 그것은 순전히 선언한다. 그래서,어떤 의미가 더 많은 이:

int*x=NULL;는 또한 올바른 C,이기는 하지만 그것을 따르지 않고 원래의 K&R 코딩 스타일입니다. 그것은 완벽하게 분명하는 유형은int*,그리고 포인터 변수이x,그래서 그것은 노골적으로도 분명하는 미숙하는 값NULL는 저장되고 있으로x는 포인터int.

또한,그것은 그것을 쉽게 파악하는 규칙은 경우:스타는 멀리서에서는 변수 이름에 그 다음 그것은 선언하는 동안,스타를 연결하는 이름입니다 포인터를 참조.

그래서 지금,그것은 더 많은 이해할 수 있는 추가로 아래로 우리는 할 수 있는x=NULL;또는*x=2;다시 말해서 그것은 그것을 쉽게 초보자를 보는 방법을variable=식지도하포인터 타입변수=pointer-식은 참조를 포인터변수=식. (를 시작하여,'현'I mean'번씩만'.)

불행한 선택의 구문시어는 서버가 이런 오류문중 하나를 선언할 때 지역 변수가 말할 수 있는int i,*p;는 선언의 정수 포인터와 정수,그래서 그것은 믿고 하나는*유용한 부분의 이름입니다. 하지만 그렇지 않고 이 구문은 그냥 기발한 특수한 경우,추가해 편리함,그리고 내 생각에 그것이 있어야지 결코 존재하기 때문에 그것이 무효화되는 규칙 나는 제안했다. 내가 알기로는,다른 곳에서는 언어입니다 이 구문,의미있는 경우에도 그러나 그것은,그것은 포인트는 차이가 길에서 포인터 유형에 정의된 C. 다른 곳에서,단일 변수 선언에서 매개 변수 목록에서,구조체의 회원들,등등. 를 선언할 수 있습니다 당신의 포인터로유형*포인터 변수는대신에입력*포인터 변수,그것은 완벽하게 합법적이고하는 것이 더 적합합니다.

해설 (8)

나는 무언가를 추가하는 서로 직교하는 많은 훌륭한 답변이 있습니다. 실제로,초기화NULL에서 멀리 나쁜 연습과 유용할 수 있는 경우 포인터 수 있습니다 또는 사용할 수 없습니다를 저장하는 동적으로 할당되는 메모리 블록.

int * p = NULL;
...
if (...) {
    p = (int*) malloc(...);
    ...
}
...
free(p);

이에 따라ISO IEC9899 표준자유는 nop 때에 인수가NULL,위의 코드(나 더 많은 뭔가 의미 있는 같은 라인을 따라)합법입니다.

해설 (13)

이것은 올바른 것입니다.

int main()
{
    char * x = NULL;

    if (x==NULL)
        printf("is NULL\n");

    return EXIT_SUCCESS;
}

이 기능이 올바른지에 대한 그것이 무엇입니다. 그것은 주소를 할당 0char x 포인터. 즉,포인트 는 포인터를 x 메모리 주소에 0.

대체:

int main()
{
    char* x = 0;

    if ( !x )
        printf(" x points to NULL\n");

    return EXIT_SUCCESS;
}

내 생각으로 당신이 무엇을 원하는:

int main()
{
    char* x = NULL;
    x = alloc( sizeof( char ));
    *x = '2';

    if ( *x == '2' )
        printf(" x points to an address/location that contains a '2' \n");

    return EXIT_SUCCESS;
}

x is the street address of a house. *x examines the contents of that house.
해설 (2)

이 null pointer

int * nullPtr = (void*) 0;
해설 (1)

그냥 기억하십시오:

C왼쪽의 값은 항상 평가하는 메모리 위치로,는 동안 오른쪽 항상 평가되는 가치(int 또는 주 또는 클래스 Foo).

해설 (5)