#c #arrays #memory #malloc
#c #массивы #память #malloc
Вопрос:
У меня проблема с этим кодом:
Main():
...
int main()
{
int i=0, choice=0;
int *array_val=NULL;
while((choice=menu_sort())!=9)
{
switch(choice)
{
case 1:
i=ins_val(amp;array_val, i);
break;
....
Я вызываю ins_val()
функцию из другого источника:
int ins_val(int **array_val, int i)
{
int j=0, add=0, k=0;
system("cls");
printf("Number to add: ");
scanf("%d", amp;add);
i ;
reall(array_val, i);
*array_val[i-1]=add;
for (j=(i-1); j>0; j--)
{
if (*array_val[j]<(*array_val[j-1]))
{
k=(*array_val[j-1]);
*array_val[j-1]=(*array_val[j]);
*array_val[j]=k;
}
}
return i;
}
и
void reall(int **array_val, int i)
{
int *arr=NULL;
arr=malloc(sizeof(int)*i);
int j=0;
for (j=0; j<i-1; j )
{
arr[j]=(*array_val[j]);
}
int size=(sizeof(int)*i);
free(*array_val);
(*array_val)=(int*)malloc(size);
if ((*array_val)!=NULL)
{
for (j=0; j<i-1; j )
{
(*array_val[j])=arr[j];
}
free(arr);
}
else
{
...
}
return;
}
Я хочу создать динамический массив, в котором я могу сохранять значения и упорядочивать их.
Моя проблема в том, что выделение памяти, потому что я могу сохранить только одно значение в array_val
массиве, даже если с malloc()
я выделяю sizeof(int)*i
, поэтому, когда я пытаюсь сохранить второе значение, я получаю ошибку.
Комментарии:
1.
*array_val[j]
—>(*array_val)[j]
Ответ №1:
Вам нужно изменить свои назначения с:
(*array_val[j])=arr[j];
Для:
(*array_val)[j] = arr[j];
Кроме того, у вас есть два цикла, в которых отсутствует индекс:
for (j=0; j<i-1; j )
Это должно быть:
for (j = 0; j < i; j )
Но ошибка segfault заключается в том, что *array_val = NULL
когда вы передаете его ins_val()
. Этот код в reall()
необходимо изменить с:
for (j=0; j<i-1; j )
{
arr[j]=(*array_val[j]);
}
int size=(sizeof(int)*i);
free(*array_val);
к чему-то вроде этого:
if (*array_val) {
for (j=0; j<i; j )
arr[j]=(*array_val)[j];
free(*array_val);
}
int size=(sizeof(int)*i);
В этом цикле вы пытались разыменовать нулевой указатель, так как *array_val
сначала имеет значение NULL.