2015-05-06 3 views
0

Я новый программист на C. Я пытаюсь удалить один элемент из статического массива и скопировать остальное на динамический массив. Программа работала нормально, но после free() я получаю ошибку сегментации. Я думаю, что указатель temp указывает на некоторую память в стеке, поэтому я получаю ошибку сегментации (потому что я пытаюсь освободить что-то, что не создано malloc). Но проблема memcpy должна копироваться из стека в кучу, так что temp остается указывать на кучу. Вот код:ошибка сегментации после memcpy и бесплатно

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv) { 
    char name [6]={'a','m', 'i', 'n','f','e'}; 
    char *temp= (char *) malloc(sizeof(char)*5); 
    memcpy(temp,name1,4); 
    memcpy(temp+4,name1+5,1); 
    int i; 
    for (i=0; i<5; i++) { 
     printf("%c\n",*temp); 
     temp++; 
    } 
    free(temp); 
} 

Вывод программы: амин

+0

Um, нигде в этом вы называете 'free', поэтому неясно, что вы подразумеваете под« после free(), я получаю ошибку сегментации ». –

+0

Я добавил его сейчас. Он расположен в конце кода – amitakCs

+3

'temp ++' означает, что вы не освобождаете указатель, который вы выделили. –

ответ

4

Использование

free(temp-i) 

Вы увеличиваем температуру в контуре. Следовательно, вы не освобождаете указатель, который вы создали.

Лучше было бы

for(i=0;i<5;i++){ 
    printf("%c\n",*(temp+i)); 
} 
free(temp); 
+0

спасибо. Оно работает. Но должен ли я каждый раз указывать указатель в начале динамического массива, прежде чем освобождать динамическую память ??? – amitakCs

+1

Если вы измените значение указателя, да. Но лучше оставить значение указателя неизменным, см. Альтернативную реализацию, упомянутую в моем ответе. – rjv

+0

Благодарю вас за помощь. – amitakCs

0
char name [6]={'a','m', 'i', 'n','f','e'}; 

Обратите внимание, что это не строка для C, потому что не терминатор строки символ «\ 0» (так что это просто массив символы, но не строка).

Кроме того

for (i=0; i<5; i++) { 
     printf("%c\n",*temp); 
     temp++; 
    } 

вы увеличиваете указатель (доступ к Экстерн части памяти) Вы не написать эту

for (i = 0; i < 5; i++) { 
    printf("%c", temp[i]); 
    } 
printf("\n"); 

Или лучше

printf("%s\n", temp); 
Смежные вопросы