2015-08-31 7 views
0

Удивительно, по крайней мере, для меня. Следующий код вызывает segmentation fault: core dump на моем ubuntu 15.04, но успешно работает на моей дебианской платформе.Ошибка сегментации на ubuntu, Запуск на debian

Также следует отметить, что у меня array есть желаемые индексы, поэтому я получаю для этого хранилище, а индексы имеют целочисленное значение.

int array_dequeue(int **array, int *n) 
{ 
    int c; 
    for (c = 0; c < *n - 2 ; c++) 
     *array[c] = *array[c + 1]; 
    *n--; 

    return 0; 
} 

//Calling that in main 
int main(int argc, char* argv[]) 
{ 
    int length = atoi(argv[1]); // ./mpi.o 4 so length is 4 
    int *VP; 
    VP = (int*)malloc(length*sizeof(int)); 

    for(i=0; i<vertices; i++) 
    { 
     VP[i] = i + 1; 
    } 
    array_dequeue(&VP, &length); 
} 

Любая помощь будет оценена по достоинству. Заранее спасибо

+3

Пожалуйста, включите определение и часть инициализации. Это может быть источником segfault. – SirPython

+1

Вы запустили программу в отладчике? У вас есть 'ulimit -c', чтобы разрешить создание coredump? Вы 'catchsegv' программы для получения stacktrace? Вы запустили его под 'valgrind'? Вы перекомпилировали «дезинфицирующее средство для адреса»? Нет? Почему нет? – EOF

+0

@SirPython Я редактирую свой вопрос, спасибо за примечание –

ответ

3

Вы упускаете порядок operator precedence при выполнении этого заявления:

*array[c] = *array[c + 1]; 

Вы думаете это означает «разыменование array, затем возьмите c и c+1 элементов из результирующего массива, и т.д ..

Что это на самом деле означает: «Возьмите c и c+1указатели от указателя к указателю базы array, затем разыгрывать те.

Другими словами, это должно быть так:

(*array)[c] = (*array)[c + 1]; 

Честно говоря, я не вижу причин, чтобы передать этот указатель на адрес в первую очередь.

И как уже упоминались в комментариях, у вас есть дополнительные вопросы с оператором старшинством с:

*n--; 

который вычитает указатель n, затем Evals предварительного значения n по разыменованию, то игнорирует результат этого Eval и маршируют дальше. Значение, сохраненное в *n, остается неизменным. Оно должно быть:

(*n)--; 

или просто:

--*n; 

Я предпочитаю последний, как вы выбрасывая Превал в любом случае. Независимо от того, потратите больше времени на изучение диаграммы приоритета связанного оператора.

+0

большое спасибо, но у вас есть идея, почему он работает на debian ?! –

+3

@HosseinShahsahebi Я не вижу никакой земной причины, почему она должна была работать * на всех * на любой платформе. Вы вызывали неопределенное поведение с указателем 'array' deref-subscripting i, поэтому, как только это произошло, все, что угодно * может привести, в том числе сценарий слепых-белок-находки-орехов и что-то, что действительно появляется * *. – WhozCraig

+0

в любом случае я ценю вашего пациента и красивое описание –

Смежные вопросы