2014-03-31 2 views
0

문자열에 정수를 추가 할 때 인쇄 할 때 정수가 표시되지 않는 이유는 무엇입니까? 코드는 다음과 같습니다.malloc을 사용하여 문자열 (생성됨)이 주어지면 Integer를 추가하는 방법은 무엇입니까?

char *newStr = NULL; 
char *backedUpPtr = NULL; 

newStr = (char *) malloc ((4) * sizeof(char)); 
backedUpPtr = newStr; 

*newStr = 'a'; 
newStr++; 
*newStr = 4; 

printf("%s", backedupPtr); 

인쇄 할 때 숫자 4는 표시되지 않습니다. 왜 그런가요? 그것을 숯에 던질 필요가 있습니까? 그렇다면 어떻게?

+0

의 malloc '의 데이터()가'제로 보장되지 않지만, 어느 쪽도 아니는 제로로하지 보장 할 수 없습니다있다. 이렇게 쓰여진 '4'는 Control-D이며 제어 문자는 일반적으로 인쇄 할 때 시각적으로 표현되지 않습니다. 당신은 아마''4 ''를 원했습니다. 문자열을 null로 끝내야합니다. 문자열 다음에 개행 문자를 출력해야합니다 (형식 문자열로''% s \ n "'). 메모리 사용을 마친 후에는'backupupPtr'을 사용하여 메모리를 free() 할 수 있습니다. –

답변

0

처음으로 문자열을 NUL 문자로 종료하지 않습니다. 따라서 은 기술적으로 C 문자열이 아닙니다. malloc에서 반환 된 메모리는 임의의 바이트를 포함하며 반드시 0 일 필요는 없습니다.

즉, 해당 코드는 문자열을 올바르게 끝내지 않아 문제가 발생할 수 있습니다. printf은 그로 인해 비명을 지르는 힙에서 잘 붕괴 될 수 있습니다.

코드 포인트 4 (CTRL-D는 ASCII)이 저장됩니다. 인쇄 가능4을 원하면 '4'을 사용해야합니다. '

, 우리는 문제의 긴 장황한 설명을 나열하는 동안,합니다 (u의 총액 재) 변수 backedUpPtrbackedupPtr 간에는 큰 차이가 있습니다, 그것은 당신이 할당 메모리를 좋은 형태로, 그리고 당신은 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; 
} 
+0

죄송합니다. 오타가 있습니다. newStr은 char * 타입이다. – StarTrek18

관련 문제