처음으로 문자열을 NUL 문자로 종료하지 않습니다. 따라서 은 기술적으로 C 문자열이 아닙니다. malloc
에서 반환 된 메모리는 임의의 바이트를 포함하며 반드시 0 일 필요는 없습니다.
즉, 해당 코드는 문자열을 올바르게 끝내지 않아 문제가 발생할 수 있습니다. printf
은 그로 인해 비명을 지르는 힙에서 잘 붕괴 될 수 있습니다.
코드 포인트 4
(CTRL-D는 ASCII
)이 저장됩니다. 인쇄 가능4
을 원하면 '4'
을 사용해야합니다. '
, 우리는 문제의 긴 장황한 설명을 나열하는 동안,합니다 (u
의 총액 재) 변수 backedUpPtr
와 backedupPtr
간에는 큰 차이가 있습니다, 그것은 당신이 할당 메모리를 좋은 형태로, 그리고 당신은 shouldn malloc
의 반환 값을 C로 캐스팅하면 특정 미묘한 오류가 발생할 수 있습니다. 또한 sizeof(char)
을 곱하는 것은 이므로 항상입니다.
결론,이 코드로 시작하고 거기에서 갈 것 :
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *newStr = NULL;
char *backedUpPtr = NULL;
newStr = malloc (4); // no need for cast or multiply
if (newStr == NULL) { // and ALWAYS check
printf ("No memory available\n");
return 1;
}
backedUpPtr = newStr;
*newStr = 'a'; // store the a
newStr++;
*newStr = '4'; // store the character 4
newStr++;
*newStr = '\0'; // make into C string
printf ("%s", backedUpPtr);
free (backedUpPtr); // also good form
return 0;
}
가와 훨씬 간단 작성 될 수 있지만 :
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *newStr = malloc (4);
char *backedUpPtr = newStr;
if (newStr == NULL) {
printf ("No memory available\n");
return 1;
}
*newStr++ = 'a';
*newStr++ = '4';
*newStr = '\0';
printf("%s", backedUpPtr);
free (backedUpPtr);
return 0;
}
또는 4 바이트이기 때문에 다소 적은 양이지만 malloc
을 전혀 사용할 필요가 없습니다 (동적 메모리 할당에 대해 직접 교육하는 경우는 제외).
#include <stdio.h>
int main (void) {
char backedUpPtr[4], *newStr = backedUpPtr;
*newStr++ = 'a';
*newStr++ = '4';
*newStr = '\0';
printf("%s", backedUpPtr);
return 0;
}
더 간단 10
또는, 아니지만 거의 교육 :-)
#include <stdio.h>
int main (void) {
printf ("a4");
return 0;
}
의 malloc '의 데이터()가'제로 보장되지 않지만, 어느 쪽도 아니는 제로로하지 보장 할 수 없습니다있다. 이렇게 쓰여진 '4'는 Control-D이며 제어 문자는 일반적으로 인쇄 할 때 시각적으로 표현되지 않습니다. 당신은 아마''4 ''를 원했습니다. 문자열을 null로 끝내야합니다. 문자열 다음에 개행 문자를 출력해야합니다 (형식 문자열로''% s \ n "'). 메모리 사용을 마친 후에는'backupupPtr'을 사용하여 메모리를 free() 할 수 있습니다. –