2017-02-24 60 views
-1

我正在處理此考試問題,無法找出用於複製類似內容的內存管理。我是新手,所以這個問題對你來說似乎微不足道。 當從一個結構複製名字和姓氏到另一個時,我會得到錯誤。也許我需要重新分配內存?我嘗試了沒有任何運氣。 預先感謝您。將動態字符串複製到結構中的動態字符串struct

PS:X標誌着錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 
typedef struct zaposleni { int id; char *ime; char *prez; } ZAP; 
typedef struct firma { char naziv[20]; int br; ZAP *zap; } FIRMA; 
void kopiraj (char *s1, char *s2) 
{ 
    while (*s1++ = *s2++); 
} 
void zaposli(FIRMA *f, ZAP *z) 
{ 
    bool x = false; int i; 
    for (i = 0; f->br > i; i++) 
     if (f->zap[i].id == z->id) x = true; 
    if (x==false) { 

     kopiraj(f->zap[i].ime,z->ime);  // X 
     strcpy(f->zap[i].prez, z->prez); 
     f->zap[i].id = z->id; 
        } 
} 

int main() 
{ 
    FIRMA f = { "Lanaco",0, NULL }; 
    ZAP z = { 1,(char*)malloc(4), (char*)malloc(5) }; 
    strcpy(z.ime, "Ana"); 
    strcpy(z.prez, "Anic"); 
    zaposli(&f, &z); 
    free(z.ime); 
    free(z.prez); 
    free(f.zap[0].ime); 
    free(f.zap[0].prez); 
    free(f.zap); 
    return 0; 
} 
+0

請澄清您的特定問題或添加額外的細節,以確切地突出你所需要的。正如目前所寫,很難確切地說出你在問什麼。請參閱如何問問頁面以獲取幫助以澄清此問題。 – Olaf

+0

@Olaf編輯,謝謝你的消化。 – techno

+0

你在哪裏設置br!= 0?否則你的循環'for(i = 0; f-> i; i ++)'永遠不會執行。 –

回答

0
typedef struct firma { char naziv[20]; int br; ZAP *zap; } FIRMA; 

我認爲問題是出在主要功能 你應該分配內存* ZAP或至少分配一個內存地址。 分配NULL給* ZAP(FIRMA f = { "Lanaco",0, NULL };),然後將其發送給函數(zaposli(&f, &z);),它試圖訪問內存地址(if (f->zap[i].id == z->id) x = true;)當您嘗試訪問的地址值是NULL你得到錯誤

f->zap[i].id您zap應該保持多於1個地址值,所以你應該在結構體或Zap ** zap中定義Zap * zap [n]。如果你定義爲ZAP ZAP公司**首先你應該分配** ZAP(zap = (ZAP**)malloc(sizeof(ZAP*)*N) N是你有多少結構要保持數),那麼你應該分配每個* ZAP值:

for(i=0;i<N;i++){ 
    zap[i] = (ZAP *)malloc(sizeof(ZAP)); // *(zap+i) = (ZAP*)malloc(sizeof(ZAP)) 
} 

,現在因爲我們將zap定義爲ZAP ** zap或ZAP * zap [N] f->zap[i].id不會起作用zap [i]當您嘗試訪問時存儲結構地址應該使用f->zap[i]->id

+0

如果您打算只保留一個帶有zap的地址,那麼將其定義爲ZAP * zap並使用f-> zap-> id。或者如果* zap保留一個結構數組,那麼你也可以使用f-> zap [i] - > id – Khan9797

+0

感謝您的回覆,將嘗試下面的內容。但請記住,我不能修改main()。它是固定的代碼,我需要使它在void zaposli()函數中工作。我明白爲什麼是錯誤保持,我試圖改變一些NULL指針的值。但是我真的不知道如何改變這個值,如果它已經被賦值爲null的話。我會請求我的老師儘快幫忙。 – techno

+0

initilazing可以爲null,但你可以創建一個函數,它返回一個像ZAP * createZap()這樣的結構地址並賦值給你f-> zap [i] = createZap() – Khan9797