Строки литерала в коде, как правило, помещенный компилятор в раздел только для чтения в памяти вашей программы. Когда вы назначаете testy2 = " THING! ";
, вы устанавливаете testy2
, чтобы указать на строковый литерал в статической памяти «только для чтения». Затем, когда вы вызываете strstrip()
для изменения этой памяти, вы получаете SIGSEGV или что-то другое, что ваша платформа вызывает его, в момент, когда strstrip()
пытается записать nul char ('\0'
), потому что вы не можете записать в память, чьи атрибуты установлены в " только для чтения». Чтобы получить копию этого строкового литерала, который вы можете изменить, вы можете использовать strcpy()
, чтобы сделать его копию, и вызвать strstrip()
на эту копию. Конечно, чтобы сделать копию, вы должны скопировать его в память, которую вы можете получить от malloc(strlen(testy2)+1)
или new char[strlen(testy2)+1]
, или, как вы это делали в своем первоначальном посте, создав локальное выделение.
Следует отметить, что strstrip()
: 1) возвращает указатель, который может отличаться от указателя пройденного, и 2) может изменять строку в памяти, переданной ей. В вашем примере вы теряете возвращаемый указатель, потому что вы его не присвоили никому ... что не так уж плохо, потому что вы можете вернуть тот же адрес указателя, просто позвонив strstrip()
на исходный указатель, но это было бы немного неэффективно, если бы вам понадобилась обрезанная строка более одного раза. Но будьте осторожны здесь ... если вы использовали malloc()
или new
для динамического выделения пространства для вашей копии строкового литерала (и назначили возвращенный адрес указателю, скажем testy2
), то не назначайте возврат strstrip() к этому указателю, иначе вы не сможете использовать указатель, чтобы освободить динамически выделенную память! Когда вы звоните free()
или delete
, вам необходимо передать исходный указатель, который вы получили от malloc()
или new
, а не указатель, который вы получили от strstrip()
.
Спасибо. Он работает сейчас. – turnt