0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 5
1

Указатели на структуру - ошибка сегментации

29.06.2016, 22:25. Показов 1090. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем привет! разбираюсь с указателями на структуру и realloc ставит в тупик.. то есть код работает, но странно что он не валится в ошибку сегментации когда копируется в структуру набор чаров без предварительного realloc (закомментил). То есть в первый раз растягиваю память под структуру от 0 до 4 байт, а потом кидается еще 3 раза по 3 чара, что уже 9 байт какбы + 4 которые уже там, без необходимости realloc. Что я не понимаю? ОС самостоятельно растягивает область памяти под структуру или типа того? в общем прошу объяснить, кто знает

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct elem {
    char record[4];
};
 
void fillstruct(struct elem **t) {
    char line[] = "abcdefghjppp";
    *t = (struct elem*)realloc(*t, 1*sizeof(struct elem));
    strncpy((*t)[0].record,line,3);
    
    //*t = (struct elem*)realloc(*t, 2*sizeof(struct elem));
    strncpy((*t)[1].record,line+3,3);
    
    //*t = (struct elem*)realloc(*t, 3*sizeof(struct elem));
    strncpy((*t)[2].record,line+6,3);
 
    //*t = (struct elem*)realloc(*t, 4*sizeof(struct elem));
    strncpy((*t)[3].record,line+9,3);
}
 
int main(int argc, char **argv) {
    struct elem *test;
    fillstruct(&test);
    printf("%s\n%s\n%s\n%s\n",test[0].record,test[1].record,test[2].record,test[3].record);
    printf("%i\n",(int)sizeof(struct elem));    
    free(test);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2016, 22:25
Ответы с готовыми решениями:

Ошибка сегментации и указатели в СИ
Снова здравствуйте, продолжаю мучать указатели и писать ужасный код. Столкнулся с такой проблемой:...

Указатели и ошибка сегментации
Добрый день, форумчане, учусь программированию, пробую реализовать стек, вот сама структура и...

Ошибка во время выполнения программы (структуры, массивы структур, указатели на структуру)
Работаю вот с таким кодом: #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;conio.h&gt;...

Ошибка Сегментации
Всем привет! При выполнении кода вылетает ошибка: &quot;Ваша программа вызвала нарушение доступа(ошибку...

5
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
29.06.2016, 23:43 2
Цитата Сообщение от vasilyperl Посмотреть сообщение
Что я не понимаю?
Вы не понимаете собственный язык. Если бы понимали, то смогли бы описать свою проблему. А так, то что описано, понятно только Вам.
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 5
30.06.2016, 17:19  [ТС] 3
Пардон, попробую переформулировать внятнее:

разбираюсь с указателями на структуру и у меня возник вопрос по поводу применения функции "realloc". Ниже привел код: этот код динамически добавляет данные в массив структур (указатель *test) и даже работает, несмотря на то, что закомментированы строки, где изменяется размер памяти (через функцию realloc), используемой под набор структур test. Вопрос в том, почему не возникает ошибка segment fault при добавлении данных в "массив" без резервирования памяти? это происходит автоматически? но тем не менее в первый раз (строка 11) это надо сделать, если не сделать, то как и ожидается, будет ошибка. Не происходит ли утечки памяти в таком коде без realloc в строках 14,17,20? Хотелось бы понять, что я не понимаю (простите за тавтологию). Прошу объяснить, кто знает.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
30.06.2016, 22:41 4
strncpy
Функция копирует из строки src в буфер dst не более чем len символов
строка при копировании была урезана до размера буфера
и еще
При правильной работе с функцией, нужно передавать в функцию значение len на единицу меньше размера буфера, а также самостоятельно устанавливать последний байт в 0
vasilyperl, в отладчик не пробовали заглядывать, что же там пишется или на печать выводить?
0
0 / 0 / 0
Регистрация: 16.02.2015
Сообщений: 5
08.07.2016, 09:46  [ТС] 5
Все о чем говорите про strncopy - все выполняется в коде.. отладчик (gdb) не пишет ни варнингов ни ошибок, выглядит так как будто все правильно. может и правильно, но в этом и вопрос
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
08.07.2016, 13:54 6
Цитата Сообщение от vasilyperl Посмотреть сообщение
То есть в первый раз растягиваю память под структуру от 0 до 4 байт, а потом кидается еще 3 раза по 3 чара, что уже 9 байт какбы + 4 которые уже там, без необходимости realloc. Что я не понимаю? ОС самостоятельно растягивает область памяти под структуру или типа того?
У вас в коде неопределенное поведение. Вы пишете вашими последними тремя стркопи в память, которая вам не принадлежит ибо не была выделена. Неопределенное поведение означает, что может быть что угодно.
1
08.07.2016, 13:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2016, 13:54
Помогаю со студенческими работами здесь

Ошибка сегментации
Есть вот такой код: #include &lt;stdio.h&gt; typedef struct{ char *temp; }strman;...

Ошибка сегментации
Здравствуйте, написал программу, запускаю- Windows пишет: &quot;обнаружена ошибка. Приложение будет...

Ошибка сегментации
Здравствуйте! Есть несколько программ. #1 вытаскивает 2 числа из очереди сообщений, перемножает,...

Ошибка сегментации
Здравствуйте! Написал классы матрица и вектор с длинными комплексными числами. Длинное комплексное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru