그것이 가능하면 초기화인터 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;
대신 합니다.
88
9
TL;DRYes,very much.
는실제적인 주장 가이드읽 like
글쎄,그들은은잘못된습니다,당신은 맞습니다.
문,(ignoring,지금은,사실에는 포인터를 정수의 변환은 구현 시 정의 behaviour)
my_int_ptr
은 변수(유형의 포인터int
),그것은 주소를 가지고 있는 자신의(유형:주소의 포인터를 정수)에 있는 저장하는 값이2
로 that 주소입니다.이제,
my_int_ptr
,되는 포인터 형식,우리가 말할 수있는,그것은 _points 를 값"유형"에는 메모리 위치 pointed by 값에서 개최된my_int_ptr
. 그래서,당신은 기본적으로 할당하여 값 of 포인터 변수의 값이 아니라 메모리의 위치가 가리키는 포인터이다.그래서에 대한 결론
초기화한 포인터 변수이
x
로NULL
,지 value 에는 메모리 주소를 가리키는 pointer_.이것은일로
Expansion:
지금 엄격하게 따르는,다음과 같은 문을
는 불법적으로 포함한 제약 조건을 위반입니다. 할 명확하고,
-
my_int_ptr
포인터 변수,유형int*
-정수 상수로,2
유형int
,에 의해 정의합니다.그리고 그들은하지 않"와 호환"유형,그래서 이 초기화가 잘못되었기 때문에 그것이's 의 규정을 위반하는 간단한 할당,장에서 설명하는§6.5.16.1/P1 에서 설명하는[Lundin's답변.
경우에 사람이's 이 관심있는 방법을 초기화가 연결이 간단한 과제의 제약을 인용
C11
,chapter§6.7.9,P11튜토리얼은 잘못된 것입니다. ISO C,
int*my_int_ptr=2;는
오류가 있습니다. 에 GNU C,그 의미와 같int*my_int_ptr=(int*)2;
. 이로 변환합니다 정수2
메모리 주소,일부 패션에 의해 결정되는 컴파일러입니다.하지 않습니다 아무것도 저장에 위치하여 해결하는 주소는(있다면). 는 경우에
*my_int_ptr=5;
,그리고 그것을 저장하는 것을 시도하십시오 숫자5
에 위치하여 해결하는 주소입니다.는 이유를 설명하기 위해서,잘못된
int*my_int_ptr=2;
은"제약 조건을 위반",그것은 코드는 허용되지 않을 컴파일하고 컴파일을 제공해야 합 진단에 따라 발생한다.당 6.5.16.1 간단한 지정:
이 경우에는 왼쪽 연산자입니다 자격이 없는 포인터이다. 데도 그것을 언급된 권리 연산자입할 수 있는 정수(연산 타입)으로 구성되어 있습니다. 그래서 코드에 위배되 C 표준입니다.
GCC 가려 제대로 작동하지 않는 한 당신이 명시적으로 말할 수 있는 표준 C 컴파일러입니다. 는 경우에 당신은 코드를 컴파일을
-std=c11-현학적 오류
,그것이 올바르게 제공한 진단으로 수행해야합니다.int*my_int_ptr=2
이는 완전히 잘못된 것입니다. 는 경우에 이것은 실제로 기록한 다음을하시기 바랍 더 나은 책이나습니다.
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 자세한 내용은.
많은 혼란에 대 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. 다른 곳에서,단일 변수 선언에서 매개 변수 목록에서,구조체의 회원들,등등. 를 선언할 수 있습니다 당신의 포인터로유형*포인터 변수는
대신에입력*포인터 변수
,그것은 완벽하게 합법적이고하는 것이 더 적합합니다.나는 무언가를 추가하는 서로 직교하는 많은 훌륭한 답변이 있습니다. 실제로,초기화
NULL
에서 멀리 나쁜 연습과 유용할 수 있는 경우 포인터 수 있습니다 또는 사용할 수 없습니다를 저장하는 동적으로 할당되는 메모리 블록.이에 따라ISO IEC9899 표준
자유
는 nop 때에 인수가NULL
,위의 코드(나 더 많은 뭔가 의미 있는 같은 라인을 따라)합법입니다.이것은 올바른 것입니다.
이 기능이 올바른지에 대한 그것이 무엇입니다. 그것은 주소를 할당 0char x 포인터. 즉,포인트 는 포인터를 x 메모리 주소에 0.
대체:
내 생각으로 당신이 무엇을 원하는:
이 null pointer
그냥 기억하십시오:
C왼쪽의 값은 항상 평가하는 메모리 위치로,는 동안 오른쪽 항상 평가되는 가치(int 또는 주 또는 클래스 Foo).