2015-12-27 2 views

ответ

4

В вашем коде,

array *array_ptr; 
array_ptr->data_array = malloc((size+2)*sizeof(int));//failing line 

array_ptr сам используются неинициализированным. Если вы попытаетесь разыменовать унифицированный указатель, вы вызовете undefined behavior. Ошибка сегментации является одним из многих эффектов UB.

Вы должны выделить память для array_ptr первых, как

array *array_ptr = NULL; 
array_ptr = malloc(sizeof *array_ptr); 
if (array_ptr)       //check for malloc success 
{ 
    array_ptr->data_array = malloc((size+2)*sizeof(int)); 
..... 
} 
else 
{ 
    printf("failure\n"); 
    exit(-1); 
} 
1

При определении локальной переменной, как этот

array *array_ptr; 

array_ptr указатель дается место в памяти, но это не указывает на a valid array struct in memory: значение неинициализированной переменной содержит некоторое случайное значение «мусора». Поэтому разыменования его в любом случае, в том числе

array_ptr->data_array = malloc ... 

является неопределенного поведения.

Вы можете это исправить, выделив некоторую память на array указывает array_ptr, как это:

array *array_ptr = malloc(sizeof(array)); 
0

вина Сегментация, как ожидается, как вы не создали память для array_ptr и вы пытаетесь ссылайтесь на него, которое в конечном итоге попытается получить доступ к data_array (для которого еще нет памяти). Таким образом, ядро ​​будет сигнализировать о завершении процесса, и, следовательно, здесь вы получите ошибку сегментации.

int size = atoi(argv[1]); 
    array *array_ptr; 
    array_ptr->data_array = malloc((size+2)*sizeof(int));//failing line 

Однако, чтобы исправить это, вы сначала создали память для array_ptr.

array *array_ptr = (array *)malloc(sizeof(array));//type casting is necessary as malloc returns pointer to void . 

После этого вы можете проверить указатель и назначить памяти для своих членов данных

if(array_ptr) 
{ 
    array_ptr->data_array = malloc((size+2)*sizeof(int));//type cast here also 
} 
0
int size = atoi(argv[1]); 
    array *array_ptr; 
array_ptr->data_array = (*int) malloc(sizeof(int)*(size+2)); 

Works?

- Edit -

я получаю номер из ARGV и преобразования в междунар. Создайте структуру. Я создаю память с размером, отличным от int plus (arg + 2), и свяжу это в структуре, только

+0

Было бы здорово, если бы вы объяснили, как работает этот код и в чем проблема в коде OP. :) –

+0

Отредактировано ... Проверьте, является ли это решением (я делаю актерский состав только для преобразования void * в int *) –