Есть много проблем с вашим кодом. Прежде всего, вы не должны использовать malloc
и друзей, если вы программируете на C ++.
char *g = (char*) malloc (sizeof(char) * 2);
g = "ab";
по электронной почте Ой. Вы только что потеряли 2 байта памяти, возвращенной вызовом malloc
, потому что теперь g
указывает на возможное место только для чтения, где хранится "ab"
.
g = (char*) realloc (g, sizeof(char) * 200);
realloc
можно вызвать только по указателю, возвращенному более ранним malloc
.
Даже если вы передали действительный указатель на realloc
, realloc
может вернуть NULL, если перераспределение завершится неудачно. В этом случае ранее выделенная память остается выделенной, но вы перезаписываете единственную переменную, указывающую на эту память, что делает невозможным освобождение более раннего выделения. См. Имея динамическое выделение массива, могу ли я изменить его размер? в списке часто задаваемых вопросов C.
Также обратите внимание, что для "ab"
требуется три байта памяти, а не два. Наконец, sizeof(char)
всегда и везде 1, поэтому нет необходимости использовать sizeof(char)
в ваших malloc
вызовах.
Правильная C версия вашей программы будет выглядеть так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
char *tmp;
char *g = malloc(3);
if ( !g ) {
return EXIT_FAILURE;
}
strcpy(g, "ab");
tmp = realloc (g, 200);
if ( !tmp ) {
return EXIT_FAILURE;
}
g = tmp;
strcpy (g, "cdefg");
puts(g);
return 0;
}
В версии C ++ вы должны использовать string
, а не планировать массивы символов старого стиля C.
См. мой ответ на другой вопрос для примера того, как перераспределить буфер для чтения полных строк для второй части вашего вопроса.
Тем не менее, обратите внимание, что код также C , и я уверен, что есть лучшие способы делать то, что вы хотите в C ++. Я просто недостаточно знаю стандартную библиотеку C ++, чтобы дать вам правильное решение в C ++.