что не так в этой программе? - PullRequest
0 голосов
/ 04 июня 2011

Невозможно запустить этот код ...

#include<cstdio>
int main()
{
struct a{
    int b;
    struct a *next;
};

    typedef struct a no;

    no *n;

    n->b = 12;
    n->next = NULL;

    n->next->b = 12;
    n->next->next = NULL;

    printf("%d %d", n->b, n->next->b);
    getchar();
    return 0;
}

Ответы [ 6 ]

6 голосов
/ 04 июня 2011

Когда вы говорите:

no *n;

вы получаете неинициализированный указатель. Когда вы используете этот указатель, вы получаете неопределенное поведение.

0 голосов
/ 04 июня 2011
#include <cstdio>

/* declaring the struct in the function definition may be possible (I'm not sure,
   actually, haha).  Unless you have a GOOD reason, it's good practice to declare
   structs, globals, typedefs, etc... outside the function */

typedef struct a{
    int b;
    struct a *next;
} no;

int main()
{
    no *n;

    /* Here, you have a pointer.  Remember these are simply (generally) 32-bit values
       defined in your stack space used to store a memory location which points to your
       ACTUAL struct a!  Depending on what USED to be in the stack space, this could
       point ANYWHERE in memory, but usually you will find that it points to the NULL
       memory location, which is just address "0".  To get this to point to something,
       you have to allocate empty space on your heap to store your struct... */

    n = malloc(sizeof(no));

    /* Now your pointer n points to an allocated 'struct a', and you can use it like
       normal */

    n->b = 12;
    n->next = NULL;

    /* You just set n->next, which is another 'no' pointer, to NULL.  This means that
       n->next points nowhere.  So, just like above you have to malloc another instance
       of the struct! */

    n->next = malloc(sizeof(no));

    /* NOW you can use n->next with no ill effects! */

    n->next->b = 12;
    n->next->next = NULL;

    printf("%d %d", n->b, n->next->b);
    getchar();

    /* After you're done with your structs, you want to free them using the POINTERS
       that reference them */

    free(n->next);
    free(n);

    return 0;
}
0 голосов
/ 04 июня 2011

попробуйте что-то вроде этого:

no *n = (no*)malloc(sizeof(no));

0 голосов
/ 04 июня 2011

Вы объявляете struct ВНУТРИ функцию.

Объявите struct ВНЕ функции.

typedef должно быть объявлено и вне функции.

#include<cstdio>

struct a{
    int b;
    struct a *next;
};

    typedef struct a no;

int main()
{

 ///... your code...
}
0 голосов
/ 04 июня 2011

Как сказал @Neil Butterworth, вы получаете неинициализированный указатель.Это означает, что этот указатель может указывать куда угодно, что приводит к ошибке нарушения доступа.Способ исправить это просто, просто вызовите malloc () перед использованием этого указателя.malloc () дает этому указателю действительный и пригодный для использования адрес, поэтому никто не будет жаловаться на это.

0 голосов
/ 04 июня 2011

Вы выделили пространство для указателя на структуру, но вы не выделили пространство для фактической структуры.Это означает, что у вас нет адреса памяти для используемой структуры.

Кроме того, указатель указывает на некоторый случайный адрес памяти, поскольку вы его не инициализировали.В результате вы можете пытаться читать и записывать в не принадлежащую вам память, что может привести к сбою вашей программы или даже вашей системы из-за неопределенного поведения, которое в результате.

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