그래서 메모리 할당을 통해 문자열을 기본적으로 만드는 프로그램을 작성하려고 해요, 문자 당 문자 읽기,하지만 키보드에서 한 입력을 통해서만. 나는 그것을하기위한 여러 가지 (더 좋은) 방법이 있다는 것을 알고 있지만, 나는이 특별한 방법으로 그것을하고 싶었다! 다음은 코드입니다 :malloc 및 getchar() 통해 문자열 만들기
int newstring (char** string)
{
printf("--------------In function newstring--------------\n");
int i = 0;
string = malloc (sizeof (char));
printf("Adress: %p\n", (void*)string);
if (string == NULL)
return -1;
while (1)
{
printf("Pre-scan\n");
*(string[i]) = getchar();
printf("After-scan\nstring[%d] = %c\n", i, *(string[i]));
i++;
if (*(string[i-1]) == '\n')
break;
printf("Reallocation to size %d\n", i+1);
string = realloc (string, sizeof (char) * (i+1));
if (string == NULL)
return -1;
}
string[i-1] = '\0';
printf("--------------Exit function newstring--------------\n");
return;
}
int main()
{
char *string;
newstring (&string);
printf("%s\n", string);
}
문제는 프로그램이 항상 3 문자를 읽기 전에 중간 충돌이다, 여기에서 발생한 printfs 있습니다
Adress: 00AE1578
Pre-scan
1st Input: >>Hello
After-scan
string[0] = H
Reallocation to size 2
Pre-scan
After-scan
string[1] = e
Reallocation to size 3
Pre-scan
내가 때문에의인지 궁금 했었어요은 버퍼의 일종을 가지고 있지만 한계가 2 문자 (난 여러 입력을 시도했습니다, 항상 세 번째 문자 앞에 붙어 도착) 믿기 힘들 찾을 수 있습니다. 또한 "scanf ("% c ", * (string [i]))"같은 결과를 시도했습니다.
당신은'free'를 호출하지 않습니다 - 프로그램은 메모리가 누출되어 메모리가 부족하기 때문에 결국 멈출 것입니다. – Dai
@Dai realloc은 이미 할당 된 메모리를 해제하기 때문에 free를 호출 할 필요가 없습니다. 당신이 내가 메인에서 무료로 전화해야한다고 말한다면, 당신은 옳다. 그러나이 프로그램은 메인에 도달하지 못했고, 그래서 그것은 문제가 아니었다! –
@ryyker 나는 그것을 잘 알고있다. 나는 누군가가 내 코드를보고 "char"배열을위한 메모리를 할당했다는 것을 알게된다. –