2010-02-17 3 views
3

НКУ 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; 
} 

ответ

5

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

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

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

2

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

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

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

2

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

0

Здесь вы не выделяете какую-либо память для «лиц» элемента структуры.

Я изменил код:

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; 
}