문자열을 읽는 간단한 프로그램을 작성했습니다.c에서 stdin에서 문자열 읽기
void main()
{
char *str; /*didn't allocate memory*/
scanf(" %s",str);
printf("%s",str);
}
하지만 세그먼트 오류가 발생합니다. 반면에 다음은 그렇지 않습니다.
void main()
{
char *str;
scanf(" %c",str);
printf("%c\n",str);
}
이 기능이 실제로 어떻게 작동하는지 명확히 알 수 있습니까?
로컬 비 정적 변수에는 * indeterminate * 값이 있습니다. 포인터와 같은 변수가있을 때 이것을 역 참조하면 * 정의되지 않은 동작이 * 생깁니다. 종종 일어날 일을 예측할 방법이 없습니다. –
호기심에서 벗어나 두 번째 프로그램을 컴파일하고 실행했습니다. 그것은 추락했다. 정의되지 않은 동작은 다른 컴퓨터, 운영 체제 및 컴파일러 조합에서 다르게 나타날 수 있습니다. –
"실제로 작동하는 방법을 분명히 밝힐 수 있습니까?" - * 그렇지 않습니다. *; * 정의되지 않은 동작 *을 호출합니다. 당신은 "작품"에 대한 정의가 프로그램이 단순히 "충돌하지 않는다"고 생각하기 때문에 성공에 대한 부드러운 생각으로 빠져 들었습니다. 정의되지 않은 동작을 호출하는 잘못된 형식의 프로그램은 확실히 그렇게 할 수 있습니다 (또는하지 않을 수도 있음). * 운이 좋지 않으면 작동 할 수도 있습니다. 더 나쁠 수 있습니다. 강사, 고용주 또는 최악의 고객이 아닌 귀하를 위해 "일할"수있었습니다. – WhozCraig