вложенные структуры, выделяющие память - PullRequest
3 голосов
/ 17 февраля 2010

GCC C89

Я получаю дамп стека в этой строке:

strcpy(comp->persons->name, "Joe");

Тем не менее, я выделил память, поэтому не уверен, почему я получу ее Я что-то здесь упускаю?

Большое спасибо за любой совет,

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

struct company
{
    struct emp *persons;
    char company_name[32];
};

struct emp
{
    char name[32];
    char position[32];
};

int main(void)
{    
    struct company *comp;

    comp = malloc(sizeof *comp);
    memset(comp, 0, sizeof *comp);

    strcpy(comp->persons->name, "Joe");
    strcpy(comp->persons->position, "Software Engineer");

    printf("Company = [ %s ]\n", comp->company_name);
    printf("Name    ==== [ %s ]\n", comp->persons->name);
    printf("Postion ==== [ %s ]\n", comp->persons->position);

    free(comp);

    return 0;
}

Ответы [ 4 ]

6 голосов
/ 17 февраля 2010

Вам нужно выделить память для persons:

comp->persons = malloc( sizeof( struct emp ) * NumberOfPersonsYouExpectToHave );

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

2 голосов
/ 17 февраля 2010

Память не выделена для поля "персоны" структуры структуры компании. Если вы выделите для этого память, все будет хорошо.

2 голосов
/ 17 февраля 2010

Вы выделили память для структуры компании, но не для структуры emp

Вы должны выделить память для comp->person: comp->person = (struct emp*)malloc(sizeof(emp))

, после этого Вы можете получить доступ к памяти, хранящейсяв комп-> человек

0 голосов
/ 22 апреля 2011

Здесь вы не выделяете никакой памяти для члена структуры 'people'.

Я изменил ваш код:

struct
{
    struct emp *persons;  
    char company_name[32];  
} company;  

struct emp  
{  
    char name[32];  
    char position[32];  
};  

int main()  
{      
    int num_persons = 1;  
    company.persons = malloc(sizeof(struct emp)*num_persons);  
    if (NULL == company.persons)  
    {  
        printf ("\nMemory Allocation Error !\n");  
        return 1;  
    }  
    strcpy(company.persons->name, "Joe");  
    strcpy(company.persons->position, "Software Engineer");  
    strcpy(company.company_name, "My_Company");  
    printf("Company = [ %s ]\n", company.company_name);  
    printf("Name    ==== [ %s ]\n", company.persons->name);  
    printf("Postion ==== [ %s ]\n", company.persons->position);  

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