2013-10-08 3 views
1

입력을 char 포인터에 두는 것에 대한 테스트 케이스를 만든다. 이 프로그램을 실행하려고하면 출력이 올바르지 않습니다 (_ @ $와 같은 일련의 임의 문자가됩니다). char 포인터의 각 요소를 인쇄하려고합니다. 코드에 몇 가지 사항을 변경했지만 여전히 잘못되었습니다 (이전과 같은 문제). 누군가가 잘못되어 가고있는 문제와 해결 방법을 파악하는 데 도움을 줄 수 있습니까?입력을 읽고 char 포인터에 넣는다

int chara; 
int counts =0; 

main(){ 

    char *buffer=(char *)malloc(sizeof(char)*25); 
    while((chara=getchar())!= EOF&& counts<25){ 
     *buffer++ = chara; 
     printf("%c\n",*buffer); 
     counts++; 

    } 
    *buffer = '\0'; 
    printf("%s\n",buffer); 
    free(buffer); 
} 
+0

'sizeof (20) == 4'. 그것은 당신이 원하는 것이 아닙니다. – SLaks

+0

'sizeof (20)'은 당신이 원하는 것을하지 않습니다. 20 바이트를 할당하려면'malloc (20)'을 원한다. 또한 구체적으로 기재하십시오. "출력이 올바르지 않습니다"라고 말하면 도움을 어렵게 만듭니다. – lurker

+0

버퍼에 1 바이트 만 채워지면 루프를 멈추기 위해 무언가를 루프에 추가해야합니다. 당신이 가지고있는 것은 영원히 돌아가고, 버퍼 뒤의 것은 무엇이든지 덮어 씌울 것입니다. –

답변

2

루프에서 buffer의 값을 증가 시키므로 루프 이후의 코드가 잘못되었습니다. 주소가 malloc()으로 반환되지 않은 주소를 가리키는 bufferfree()으로 증가 할 수 없습니다.

기본적으로 당신이하고있는

:

당신이 free()에 전달 주소가 더 이상 오류 인 malloc()에 의해 반환 된이 동일하다는 것을 의미
char *buffer = malloc(25); 
... 
free(buffer + length of string the user entered); 

. 당신이 buffer가 가리키는 곳으로 chara를 할당 buffer을 증가하고 지금 가리키는 buffer 제 (초기화) 위치를 인쇄 -

*buffer++ = chara; 
    printf("%c\n",*buffer); 

인쇄 밖으로 쓰레기 :

+0

나는 그것을 얻지 않는다, 나는 free()가 단지 버퍼에 할당 된 메모리를 자유롭게한다고 생각한다. 왜 malloc()이 반환하지 않는 주소를 가리키고 있습니까? – Arabeka

+0

당신은 계속해서'buffer'를 증가 시켜서 메모리의 시작 부분을 가리 키지 않으므로 malloc이 반환 한 주소 여야합니다. –

2

코드를 수정하십시오.

int chara; //getchar() returns int 
    int i=0; 
    char *buffer=malloc(20); //allocate correctly 
    while( ((chara=getchar())!= EOF) && (i!=19)) { //check against EOF and check counter value to avoid input with legth greater than allocated size. 
     buffer[i]= chara; 
     //use indexing with counter variable to avoid errors with free() 
     // if change pointer you can't free() memory 
     printf("%c\n",buffer[i++]); 
    } 

    buffer[i] = '\0'; 
    printf("%s\n",buffer); 
    free(buffer); 
+1

여전히 입력이 19 자보다 길면 버퍼가 오버플로되지 않도록 카운터가 필요합니다. –

+0

실제로 카운터 검사가 추가되었습니다. – Gangadhar

+0

잘 카운터를 추가하더라도, 예상 한대로 char 포인터의 값을 여전히 인쇄하지 않습니다. 출력은 임의의 문자입니다 – Arabeka

0

귀하의 다른 문제는이 때문이다.

chara 대신 인쇄하십시오.

+0

예, 알겠습니다. 문제가 발생할 것입니다. – Arabeka

관련 문제