Распределение стека
char *mystring ="love is alweys better yoe";
Это создает строковый литерал в постоянной памяти, и вы не можете впоследствии записать его для изменения символов.
Вы должнывместо этого инициализируйте вашу строку следующим образом:
char mystring[] ="love is alweys better yoe";
Это выделит массив символов размером 26 байт - 1 байт на символ, заканчивающийся нулевым символом \0
.
Обратите внимание, что есливы пытаетесь записать после конца буфера (т. е. после символа \0
), вы можете вторгаться в память, выделенную для других данных в вашей программе, и это может иметь нежелательные последствия.
Распределение кучи
Предыдущий пример выделяет память в стеке и будет освобожден в конце текущего уровня области видимости (обычно это функция, в которой вы находитесь).Если вы хотите, чтобы память сохранялась после завершения вызова функции, вам нужно выделить ее в куче следующим образом:
int bufferSize = 26;
char* mystring = malloc(bufferSize);
strncpy(mystring, "love is alweys better yoe", bufferSize);
И вам нужно будет помнить free
эту память, когда выпокончим с этим:
free(mystring);
Если free
извлекается из вызывающей функции, вам нужно будет вернуть указатель char*
обратно к вызывающей стороне, чтобы он знал, какая ячейка памяти free
.Если вы не free
этой памяти, ваша программа утечет память.
Увеличение размера строки
Если вам нужно изменить размер строки после выделенияпамяти для него можно использовать realloc
:
char* mybiggerString = realloc(mystring, bufferSize + 10);
strncpy(mystring, "I can fit more in this string now!", bufferSize);