C에서 포인터와 메모리가 작동하는 방식에 대해 자세히 알아보기 위해 malloc()과 다양한 문자열 함수 간의 상호 작용을 테스트했지만 다음 상호 작용에 대해서는 약간 혼란 스럽습니다.malloc 및 strcpy 상호 작용
char *myString = malloc(5); // enough space for 5 characters (no '\0')
strcpy(myString, "Hello"); // shouldn't work since there isn't enough heap memory
printf(%s, %zd\n", myString, strlen(myString)); // also shouldn't work without '\0'
free(myString);
위의 모든 사항이 제대로 작동하는 것으로 보입니다. 각 문자에 대해 null 종결자가 있는지 확인하기 위해 printf()를 사용해 보았지만 '\ 0'이 공백으로 인쇄하는 것처럼 보입니다.
- 문자열 리터럴은 항상 암시 널 종료가됩니다
내 혼란에있다.
- 의 strcpy는 MyString의에 null 종결을 복사해야하지만, 충분히 할당 된 힙 메모리가없는 mystring에 터미네이터를하지 않는 한
- 의 printf/strlen 함수가 작동하지해야 mystring에 분명히 널 (NULL) 종료를 가지고 있기 때문에
, 어디 있니? 임의의 메모리 위치에 배치 되었습니까? 위의 코드가 발생하기를 기다리고있는 오류입니까?
버퍼 오버런. – jxh
나를 따라 반복 : "정의되지 않은 동작"은 "정의되지 않음"을 의미합니다. "실패 보장", "경고 발생"또는 예측 가능한 다른 의미는 아닙니다. 그것이 효과가 있기 때문에, 그것이 잘못된 것은 아무것도 없다는 것을 의미하지는 않습니다. –
버퍼를 오버런하여 정의되지 않은 동작을 호출합니다. "위의 모든 것이 제대로 작동하는 것"이라는 것이 당신에게 운이 좋은 것입니다. 정말로 _un_lucky라고 말해야합니다. 문제가 생길 때 프로그램이 충돌하여 프로그램을 고칠 수 있기를 바랍니다. 그렇지 않으면, 그들은 가장 부적절한 때에 나타납니다 ... – yano