#include<stdio.h>
int main()
{
const int sum=100;
int *p=(int *)∑
*p=101;
printf("%d, %d",*p,sum);
return 0;
}
출력
101, 101
*/
P 점에서 INT 왜/어떻게하면 * 합계의 가치를 바꿀 수 있습니까?
#include<stdio.h>
int main()
{
const int sum=100;
int *p=(int *)∑
*p=101;
printf("%d, %d",*p,sum);
return 0;
}
출력
101, 101
*/
P 점에서 INT 왜/어떻게하면 * 합계의 가치를 바꿀 수 있습니까?
정의되지 않은 동작입니다. 코드의 버그입니다. 코드가 '효과가있는 것'이라는 사실은 의미가 없습니다. 컴파일러는 프로그램을 충돌 시키거나 프로그램이 무의미한 (예 : const가 아닌) 값을 변경하도록 허용합니다. 아니면 뭔가 다른 것을하십시오. 행동에 대한 요구 사항이 없기 때문에 행동에 대해 '이유'를 부여하는 것은 의미가 없습니다.
코드가 C++로 컴파일되면 C++이 암시 적으로 const
을 버리지 않으므로 오류가 발생합니다. 잘하면, C로 컴파일 될 때조차도 경고를 받게 될 것입니다.
+1 UB의 마법의 땅에 들어갔다. –
코드를 .cpp로 컴파일하고 출력으로 다음을 얻었습니다. 101, 100 괜찮 았지만 출력이 더 정상적으로 여기 컴파일됩니다. – sbose
참고 : C++에서 컴파일하지 않는다고 (int *) 캐스트가 코드에 없었습니다. 이 캐스트는 코드를 C++로 컴파일하지만'* p = 101; '표현식은 여전히 정의되지 않은 동작입니다. 당신에게 이해되는 것을 가지고 있다는 사실은 여전히 중요하지 않습니다. –
p
에는 변수 sum
의 메모리 주소가 포함됩니다. *p
구문은 sum
의 실제 값을 의미합니다.
당신이 말하고있는
*p=101
말할 때 : (변수 sum
가 저장되어있는 주소) 주소 p
로 이동하여 값을 변경합니다. 따라서 실제로 변경하는 사람은 sum
입니다.
그건 내 요점이야. sum이 const로 정의 된 경우 어떻게 변경해야합니까? – sbose
const는 메모리 위치를 보호하지 않습니다. 변수 합계 만 보호합니다. Const는 컴파일시에만 점검됩니다. –
컴파일러에게 "이 변수를 수정해서는 안되며 말해봐"라고 말하는 컴파일 타임 플래그로 const
을 볼 수 있습니다. 이 변수를 실제로 수정할 수 있는지 여부에 대해서는 아무 것도 시행하지 않습니다.
그리고 있습니다는 const가 아닌 포인터를 통해 그 변수를 수정하기 때문에, 컴파일러는 실제로 당신을 말할 것입니다 : 당신은 당신의 자신의 약속을 깨고
main.c: In function 'main':
main.c:6:16: warning: initialization discards qualifiers from pointer target type
를, 컴파일러는 경고를 표시하지만, 당신에게 드릴 것입니다 행복하게 진행하십시오.
안녕하세요, int * p = (int *) ∑에 질문을 편집했습니다. 경고가 표시되지 않습니다. – sbose
@SHOUBHIKBOSE 강제로'(int *)'로 캐스팅하기 때문에 컴파일러에게 "닥쳐, 내가하는 일을 안다". 그래서 아무 경고도. –
동작이 정의되지 않았습니다. 즉, 다른 컴파일러 구현, 아키텍처, 컴파일러/최적화 프로그램/링커 옵션에서 다른 결과가 발생할 수 있습니다. 분석을 위해서
(면책 조항 :. 내가 컴파일러를 모르는 이는 컴파일러가이 상황을 처리하기 위해 선택할 수있는 방법에 단지 논리적 인 추측에서이다 순진 어셈블리 언어 디버거 관점.)
sum
의 모든 인스턴스를 리터럴 100
으로 변경하기 위해 찾기 및 바꾸기를 수행하는 것처럼 r 값을받습니다.
printf
이의 분위기에 따라 달라집니다 int main() { printf("%s, %s", (b1? "100" : "101"), (b2? "100" : "101")); return 0; }
곳 b1
및 b2
로 전환됩니다
다른 최적화 설정으로 시도해보십시오. 대부분의 컴파일러는 101, 100을 충분히 최적화 할 수 있도록 인쇄합니다. –