Этот код вызывает ошибку сегментации:
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, вы получите сообщение об ошибке.