Структурировать указатель?Что-то идет не так - PullRequest
1 голос
/ 02 ноября 2010

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

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int pos;

typedef struct _Parking Parking;

struct _Parking
{
    int   pos;    
    char  name[15];       
    char  description[80];  
    float price;         
    int   slots[5];       
    char  last_driver_id;    
    int   reservations;   
};

Parking *myaccounts;

int create_Parking()
{
    strcpy(myaccounts->name,"Pro");
    myaccounts->pos ++;

    return pos-1;               
}

int main()
{

    int a;

    a = create_Parking();

    printf("a=%d\n",a);
    printf("name=%s\n",myaccounts->name);

    system("pause");    
    return 0;    
}

Ответы [ 4 ]

8 голосов
/ 02 ноября 2010

Ваш указатель myaccounts инициализируется значением NULL (как глобальная переменная) и поэтому не указывает на используемую память.Попробуйте страницу руководства для malloc для получения дополнительной информации.

Редактировать: Включенный комментарий Maciej.

6 голосов
/ 02 ноября 2010

Вы никогда не выделяете память для «myaccounts».

3 голосов
/ 02 ноября 2010

Указатели в C не указывают на допустимую память (и будут аварийно завершать работу, если вы попытаетесь их использовать), пока вы не укажете их где-то действительным, используя оператор address-of для объекта (&) или выделив памятьдля них и присвоения этого адреса в указатель (malloc() и друзья).Конечно, если вы используете оператор адреса, это местоположение может стать недействительным, когда объект выходит из области видимости.Если вы используете malloc(), это местоположение может стать недействительным при вызове free().В любом случае ваш указатель снова станет недействительным.

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

0 голосов
/ 02 ноября 2010

Ваш указатель ни на что не указывает. Вы можете попробовать любой из них:

Parking myaccountsInstance;
Parking *myaccounts = &myaccountsInstance;

Или в основной функции:

Начните с:

myaccounts = (Parking*)malloc(sizeof(Parking));

И заканчивается:

free(myaccounts);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...