2013-09-01 1 views
0

문자열 배열을 동적으로 할당하려고했는데 프로그램에서 사용자에게 문자를 묻고 문자 'q'가 입력 될 때까지 배열의 첫 번째 문자열에서이를 수집한다고 가정합니다. 프로그램은 문자를 두 번째 줄에 추가하는 식으로 시작합니다.포인터를 증가시킬 때 C 오류에서 2D 동적 할당

문자 메모리 위치를 인쇄 할 때 각 문자가 두 개가 아닌 두 개의 메모리 셀을 사용하는 것처럼 보입니다. 여기

출력 내가 포인터에 문제가있을 수 있습니다 생각이

>j 
>0x9e12021 
>0x9e12022 
>s 
>0x9e12023 
>0x9e12024 
> 

처럼 내 프로그램

#include <stdio.h> 

void main() 
{ 

    char** txt; 
    char* baseAddress; 

    txt = (char **)malloc(5*sizeof(char*)); 
    *txt = (char *)malloc(20*sizeof(char)); 

    baseAddress = *txt; 


    while (*(*txt) != 'q') 
    { 
     (*txt)++; 
     scanf("%c", (*txt)); 
     printf("%p\r\n", (*txt)); 
    } 

    *txt = '\0'; 

    printf("%p", baseAddress); 

    free(baseAddress); 
    free(txt); 
} 

의 소스 코드입니다. 어떻게해야합니까? 그리고 나쁜 영어에 대해 유감이다

+0

'q'에 대한 초기 검사는 불확정 값 ('* (* txt)'의 값은 아직 설정되지 않음)에 대한 것입니다. 다른 오류뿐만 아니라 그 오류를 수정할 수도 있습니다. – WhozCraig

+0

'main()'의 리턴 타입은 표준 C와 마이크로 소프트 C에서'int'입니다 - 텍스트 북에서 보는 것과는 반대로'void main()'은'main()'에 대한 선언으로 받아 들일 수 없습니다 - Microsoft C 컴파일러는 실제로 그것에 대해 불평하지 않을 수도 있습니다. 그리고 MS 코드에서 C99 이상에서만 그 반환을 생략 할 수 있기 때문에'return 0;'또는'main()'의 끝에 뭔가가 필요합니다 (표준 IMNSHO의 버그입니다 만, 너무 늦었습니다.) 그것에 대해), MS는'main()'을위한 특별판을 갖고 있지 않은 C89 만 지원합니다. –

+0

1. 어디에서 main()을 무효화합니까? 2. malloc()에서 리턴을 던지지 마십시오. 3. sizeof (char)를 사용하지 마십시오. 항상 1입니다. 4. 괄호를 너무 많이 사용하지 말고 연산자 우선 순위를 배우십시오. 이렇게하면 코드를 코드에 추가하는 것이 더 명확하지 않습니다. 5. WhozCraig가 말했듯이, 당신이 그것에 쓰기 전에'** txt'에 접근하고 있습니다. 그것은 나쁘다. 6.C에서 일반 텍스트 모드로'stdout'을 출력 할 때'\ r \ n '을 사용하지 마십시오. 단지'\ n'입니다. 7.'malloc()'이 실제로 리턴하는지 검사하십시오. 메모리가 확보되지 않을 수도 있습니다. –

답변

1

는 exacty 당신 코드는 무엇을 :

+----------------------------------------------+ 
|  +--------------------------------------+ | 
| txt|*txt |*txt+1 |*txt+2 |*txt+3 |*txt+4 | | 
|  +--------------------------------------+ | 
|  ^ ^ no memory alloc ^ | 
|  |  |_______not used_______|  | 
|  +----+         | 
|*txt |____| <------------------------------+---you never give a value here,        
| +1 |____| <--j       | 
| +2 |____| <-- '\n'      | 
| +3 |____| <--s       | 
| +4 |____| <-- '\n'      | 
| . .          | 
| . .          | 
| . ____         | 
| +19 |____|         | 
+----------------------------------------------+ 

그래서 당신이 필요합니다

  1. 루프 동안을 재 작성하고 '\n'
  2. 을 처리 할 때 사용자 유형 Q, 새로운 ALLOC 문자열 메모리를 수집하고 사용자 입력을 수집합니다.

Suggust :

당신에 fisrt 문자열

사용 txt[0] 대신 *txt 대신 **txt and (*txt)++txt[0][i] and i++ 사용합니다.

희망을 도울 수 있습니다. :-)

+0

정말 고마워요 - 줄 바꿈 문자를 잊어 버리고 있었어요. – user2736527

1

당신은 개행 문자를 잊고있다.

예를 들어 입력 내용이 "js"라고 생각할 수 있습니다. 그러나 Enter 키를 누르기 때문에 실제로 "j \ ns \ n"입니다.

그래서 한 번에 두자를 입력하고 있으며 한 번에 두자를 읽습니다. 코드가 정상적으로 작동합니다.