помогите со структурами и циклом в C - PullRequest
2 голосов
/ 06 сентября 2011

новичок в Си здесь.Это законно здесь?Я получаю нарушение статуса доступа, когда я запускаю этот код:

struct point {
    char *x;
    char *y;
}

int main()
{
    ....
    struct point *pt;

    for (;;)
    {
        ....        
        pt = process_message(message);
        printf("%s",pt->x);
        ...
    }
}

struct point* process_message(char* message)
{
    struct point *pt;
    pt = malloc(1*sizeof(struct point))
    strncpy(pt->x, message, 4);
    return pt;
}

РЕДАКТИРОВАТЬ

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

Ответы [ 5 ]

11 голосов
/ 06 сентября 2011

Вам нужно выделить память для struct point в process_message.

Что-то вроде этого:

struct point* process_message(char* message)
{
    struct point *pt;
    pt = malloc(1*sizeof(struct point));
    // ... do some processing ...
    return pt;
}

Конечно, вы должны free указатель в какой-то момент позже.

Также вы должны вернуть struct point в process_message или проверить соответствие типов. Если вы посмотрите внимательно, вы увидите, что возвращаете struct price*, но ожидаете(на вызывающей стороне) a struct point *.

ОБНОВЛЕНИЕ :

Теперь, когда этот вопрос был обновлен, вам также необходимо выделить память для char *x и char *y если вы хотите сделать это:

strncpy(pt->x, message, 4);

Я бы порекомендовал немного (или много) прочитать об управлении памятью и указателях в C ++.Указатели - не единственный способ работы с данными на языке программирования C .

(НЕТ ОШИБКИ, ПРОВЕРЕННОЙ ДЛЯ ПРОСТОТЫ КОДА)

5 голосов
/ 06 сентября 2011

Ваша main функция в порядке. Ваша проблема в process_message, где вы используете указатель на структуру, но не выделяете для нее память, обращаетесь к ней, а затем возвращаете ее. Объявление одного указателя не создает память для хранения структуры. Таким образом, вы должны выделить (например, malloc) память для структуры, чтобы память «существовала» после завершения функции. Затем вы можете вернуть указатель на него, как вы делаете, а затем вы free в основном, когда вы сделали с ним.

Возможно, есть лучшие способы для достижения цели, учитывая простую операцию, которую вы делаете. Один из них - сохранить одну «чистую» структуру в вашей функции main и передать ее адрес в сообщение процесса:

struct point pt;
process_message(message, &pt);
printf("%s", pt.x);

Это будет «Повторно использовать» локальную память и не потребовать alloc / free. Обратите внимание, что вы ничего не возвращаете, вы просто «заполняете» структуру в функции процесса.

Наконец, если вы используете современную версию C, вы можете просто вернуть полную структуру из функции, если хотите:

struct point process_message(char* message)
{
    struct point pt;
    ... do some processing ...
    return pt;
}

И назовите это так:

struct point pt = process_message(message);
2 голосов
/ 06 сентября 2011

Не забудьте выделить память в функции process_message

pt = malloc (sizeof (struct point));
/* do processing */
return pt;

также после того, как вы закончили работать с pt, не забудьте освободить ее free (pt).

РЕДАКТИРОВАТЬ

Также вам необходимо выделить блоки памяти для хранения строк в x и y в функции после выделения pt.Когда вы закончите работать, вам нужно сначала освободить строки (блоки памяти), а затем структуру.

0 голосов
/ 07 сентября 2011

Как написано сейчас, вы выделяете точку структуры, но эта структура содержит указатели на строки, а не хранилище для самих строк.Вам необходимо выделить место для строк перед копированием в них:

pt = malloc(1*sizeof(struct point));
pt->x = (char *)malloc( strlen(message) + 1);

Не забудьте сделать то же самое для pt-> y, прежде чем использовать его, и не забудьте отдельно освободитьхранилище, выделенное для строк, а затем выделенное для структуры.

0 голосов
/ 06 сентября 2011

Всякий раз, когда вы создаете указатель, это просто размер памяти (ptr), который указывает на некоторые данные.Поэтому у вас должна быть память, где хранятся ваши данные.Поэтому выделите память либо в своей функции (process_message), либо в вызывающей функции.это должно идти как

struct point *pt = (struct point*)malloc(sizeof(struct point));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...