segmentation fault при использовании free ()

Этот код вызывает ошибку сегментации:

int main(){ char *p; char a[50] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; p = (char *)malloc(50*sizeof(char)); if(!p){ cout << "Allocation Failure"; cout << "\n"; } else{ cout << "Allocation Success"; cout << "\n"; p = a; cout << p; cout << "\n"; free(p); } return 0; } 

Результат после выполнения этой программы:

 Allocation Success aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Segmentation fault 

Я не могу найти ошибку. Что может быть причиной?

Вы звоните free на блок памяти, который не был выделен с использованием одного из методов malloc .

Когда вы выполните: p = a вы назначаете p памяти, используемой массивом стека a . Эта память не была выделена с помощью malloc и, следовательно, ее нельзя освободить, используя free .

Кроме того, с этим повторным назначением вы потеряете информацию о блоке, который вы первоначально выделили с помощью malloc и присвоили p , что вызвало утечку памяти.

Это:

 p = a; 

копирует указатель , а не содержимое заостренной памяти. p теперь указывает на первый элемент массива a . Поэтому, когда вы делаете free(p) , вы пытаетесь освободить нединамический массив, что не имеет никакого смысла. 1

Вы должны исследовать strncpy() для копирования строк.


1. И это также вызывает утечку памяти.

char a[50] выделяет массив из пятидесяти символов в стеке. a поэтому указывает на адрес в стеке.

p = a множества p для указания того же адреса, что и a . Поэтому после p = a , p указывает на адрес в стеке. Помните, что p содержит адрес .

Впоследствии free(p) пытается освободить область памяти в стеке, что является незаконным. Вы можете освободить только память из malloc ().

вы на самом деле имели в виду memcpy (p, a, 50); не p = a, помните, что C не имеет строкового типа данных.

 p = a; // p points a 

Выполняя эту строку, p должен указывать на const string ( char * ). Вы не можете free() все, что не получается, вызывая malloc или calloc . Поскольку в этом примере вы пытаетесь free() строку const, вы получите сообщение об ошибке.