0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 2
|
||||||
1 | ||||||
segmentation fault(29.11.2013, 17:14. Показов 8722. Ответов 18
Метки нет (Все метки)
Chto ne tak? Pomogite...
0
|
29.11.2013, 17:14 | |
Ответы с готовыми решениями:
18
Segmentation fault Segmentation fault strcpy() Segmentation fault(Core dumped) Bad allocation || Segmentation fault |
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
29.11.2013, 18:30 | 2 |
Анечка, удивительно, что у вас этот код вообще скомпилировался. Вы ж пытаетесь создать дивный гибрид статического и динамического массива. Суть в том, что размер для статического массива не задается динамически, а динамический массив не задается так, как вы его задали.
Мало того. Вы с чистой совестью даете компьютеру команду выделить а хрен его знает сколько памяти. В строке с malloc'ом значение n еще не задано. Начните с этого. И вообще, лучше словами объясните, что должна делать программа. А то ваш код, кажется, не отражает всю глубину ваших замыслов
0
|
0 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 2
|
|
29.11.2013, 18:38 [ТС] | 3 |
программа должна создать массив с рэндомным количеством чисел, выбранных тоже рэндомно) и вывести его на экран. каким то образом код скомпилировался, НО при выполнении ./ выдаёт segmentation fault.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
||||||
29.11.2013, 19:34 | 4 | |||||
Я не могу сказать, почему конкретно выдавался сегментейшн фолт. У меня этот код предсказуемо не скомпилировался.
Должно быть как-то так:
P.S. Пардон, в вашем коде в malloc я не увидела, что там число, а не n передается. Если у вас действительно такой пофигистичный компилятор, то ошибка памяти могла возникнуть при попытке передать ссылку на выделенную память в статистический массив неизвестного размера.
1
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|
29.11.2013, 21:56 | 5 |
Ошибка возникла именно по этой причине.
А компилятор не обижайте. Cогласно стандарту (включая C99) он ДОЛЖЕН компилировать указанный код, несмотря на его абсурд, выдав соответствующие предупреждения. (об использовании неинициализированной переменной gcc сообщает при наличии опции -Wall)
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
||||||
29.11.2013, 22:35 | 6 | |||||
У меня именно gcc 4.7 не хотел компилить указанный код, ругаясь на строку:
0
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|||||||||||
29.11.2013, 23:22 | 7 | ||||||||||
PS.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
30.11.2013, 00:59 | 8 |
Прошло без замечаний только после замены строки на Вашу. Выдал сегментейшн фолт. Цель достигнута!
Если модератор не сочтет за флейм, то интересно спросить: что происходит здесь на уровне памяти? 1) создается статический массив случайной длины 2) указатель, возвращаемый функцией маллок, записывается в этот массив (в конец массива) в виде long. На 64-х битной системе в этот момент побеждают зло и хаос, о чем и гласит название темы. 3) Если будет 32-х битная система, то с большой степенью вероятности все прокатит. Последний элемент массива, куда записался адрес памяти, будет перезаписан в цикле, так что пользователь даже не заметит. Ночью моск не варит, но как-то так получается. Я тоже недолго программирую, мне это интересно. Да и автору темы полезно будет.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
30.11.2013, 02:26 | 9 |
На моей системе ошибка возникает хоть и на этой строке, но еще до вызова malloc. По причине ошибки доступа к стеку, думаю, для того, чтобы положить в него адрес возврата. А указатель стека указывает на память, в которой нет доступа из-за переполнения стека.
Попробуйте из этой строки удалить "str[n]=(int)" и оставить только malloc, может свалиться на нем же, если повезет с данными на стеке. Добавлено через 5 минут malloc может и не вызваться. И эта ошибка будет воспроизводиться не всегда. Если увеличить размер стека каким-нибудь ulimit -s, то ее можно избежать и приложение не будет падать.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|||||||||||
30.11.2013, 03:01 | 10 | ||||||||||
На Suse 12.3 падает даже при закомментированной строке с маллоком. НЕ падает, если задать размер статического массива при объявлении:
И ладно, пускай ноль! Ведь массив нулевой размерности тоже можно было объявить: #
Если все дело в n, почему так важно, что размерность не объявлена черным по белому? В чем (с точки зрения процессора) разница между случайной областью памяти, которую компилятор автоматически переведет в число, и "осмысленно" присвоенным значением?
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
30.11.2013, 03:05 | 11 |
Логично. Я не говорил о том, что он не упадет. Я пишу о том, что причина не в str[n] =
Тоже логично ) С чего ты взяла, что 0? Запусти valgrind на свое приложение, покажи вывод. Переполнение стека, выше писал. В том, что у разных областей памяти разные права доступа. Почитай про стек и про то, как он работает.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|||||||||||
30.11.2013, 03:06 | 12 | ||||||||||
От чего зависит разница в реакции различных linux ОС на один и тот же код? Не первый раз встречаю, что сегментейшн фолт постоянно выдается на одной системе, и далеко не каждый раз - на другой.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||||
30.11.2013, 03:17 | 13 | |||||
какая разница, что у тебя... Я говорю, что воспроизводиться она будет не всегда. А ты пишешь, что у тебя..
Это зависит не от твоей ОС. Добавлено через 3 минуты Пожалуйста:
От ОС это не зависит. От компилятора, от того, какой мусор окажется на стеке, от размера стека.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
30.11.2013, 03:22 | 14 |
Разве это разные области памяти? Это одна и та же переменная n, как я понимаю. В одном случае там наше значение, в другом - мусор, из которого компилятор сделает значение. Заметьте, я не утверждаю, что я права.) Добавлено через 2 минуты [QUOTE=Vourhey;5412821]/QUOTE] Узбагойся.
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||||
30.11.2013, 03:37 | 15 | |||||
что такое?
Смотря, что ты понимаешь под "область памяти". Разные страницы с разным доступом.
А при чем тут переменная n?
ладно, блин, на пальцах... Возьмем, например, что стек у программы 1 мегабайт. Опустим, что стек растет от больших адресов к меньшим. Для простоты пусть будет наоборот. И вот у нас стек лежит по адресам от 0 до 1024. Когда я говорю, что объявляю массив str[10], то он, грубо, валяется в области от 0 до 9. Когда ты вызываешь функцию на стек кидаются еще всякие данные (опустим пока конкретику). То есть, в область, начиная с 10 (адрес после массива) запишутся какие-то данные.
Но если у меня берется случайное значение, то массив может занять область от 0 до 16000, например. Получается, что адрес 16000 уже выходит за пределы памяти выделенной для стека. И у нашей программы доступа туда уже может не оказаться (как повезет). И вызов функции еще до своего начала упадет при ошибке доступа к 16001 адресу. Так понятнее? Добавлено через 5 минут Автоматический? Зависит от того, сколько система выделит памяти стеку Протестируй:
1
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
30.11.2013, 03:37 | 16 |
0
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
30.11.2013, 03:41 | 17 |
В данном случае, надеюсь, говорящий?
Добавлено через 1 минуту Например: http://www.ozon.ru/context/detail/id/5061928/ http://www.ozon.ru/context/detail/id/2631566/ И книги по отладке могут содержать в себе по частям разную информацию, обычно там это описывается.
0
|
8 / 6 / 5
Регистрация: 11.11.2013
Сообщений: 75
|
|
30.11.2013, 03:57 | 18 |
Прекрасные книги, спасибо.
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
07.12.2013, 00:49 | 19 | |||||
не в конец, а за конец
в цикле тот "элемент" даже затронут не будет, потому что цикл работает в пределах массива чтобы понять, нужно сначала это дело разравнять (сделать читаемым)
0
|
07.12.2013, 00:49 | |
07.12.2013, 00:49 | |
Помогаю со студенческими работами здесь
19
Исправить ошибку, приводящую к segmentation fault Segmentation fault в конце работы программы XDestroyImage(image); Segmentation fault (core dumped) При записи в бинарный файл происходит segmentation fault Segmentation fault (core dumped) при большом размере массива Printhepl ключом -h выдает что делает программа, но в конце пишет segmentation fault(core damped) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |