문자열 배열을 동적으로 할당하려고했는데 프로그램에서 사용자에게 문자를 묻고 문자 '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);
}
의 소스 코드입니다. 어떻게해야합니까? 그리고 나쁜 영어에 대해 유감이다
'q'에 대한 초기 검사는 불확정 값 ('* (* txt)'의 값은 아직 설정되지 않음)에 대한 것입니다. 다른 오류뿐만 아니라 그 오류를 수정할 수도 있습니다. – WhozCraig
'main()'의 리턴 타입은 표준 C와 마이크로 소프트 C에서'int'입니다 - 텍스트 북에서 보는 것과는 반대로'void main()'은'main()'에 대한 선언으로 받아 들일 수 없습니다 - Microsoft C 컴파일러는 실제로 그것에 대해 불평하지 않을 수도 있습니다. 그리고 MS 코드에서 C99 이상에서만 그 반환을 생략 할 수 있기 때문에'return 0;'또는'main()'의 끝에 뭔가가 필요합니다 (표준 IMNSHO의 버그입니다 만, 너무 늦었습니다.) 그것에 대해), MS는'main()'을위한 특별판을 갖고 있지 않은 C89 만 지원합니다. –
1. 어디에서 main()을 무효화합니까? 2. malloc()에서 리턴을 던지지 마십시오. 3. sizeof (char)를 사용하지 마십시오. 항상 1입니다. 4. 괄호를 너무 많이 사용하지 말고 연산자 우선 순위를 배우십시오. 이렇게하면 코드를 코드에 추가하는 것이 더 명확하지 않습니다. 5. WhozCraig가 말했듯이, 당신이 그것에 쓰기 전에'** txt'에 접근하고 있습니다. 그것은 나쁘다. 6.C에서 일반 텍스트 모드로'stdout'을 출력 할 때'\ r \ n '을 사용하지 마십시오. 단지'\ n'입니다. 7.'malloc()'이 실제로 리턴하는지 검사하십시오. 메모리가 확보되지 않을 수도 있습니다. –