2017-02-24 20 views
-1

この検査の問題に取り組んでおり、このようなものをコピーするためのメモリ管理を把握することはできません。私は初心者ですので、この問題はあなたにとって些細なことかもしれません。 名前と姓をある構造から別の構造にコピーするとエラーが発生します。たぶん私はメモリを再割り当てする必要がありますか?私は運が無ければそれを試みた。 ありがとうございます。動的文字列を構造体内の動的文字列にコピー

PS:Xは、私は問題はあなたが* ZAPためのメモリを割り当てるか、少なくともメモリアドレスを割り当てる必要があります主な機能 であると思い

#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

具体的な問題を明確にしてくださいあなたが必要とするものを正確に強調する追加の詳細。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明確にする方法については、How to Askページを参照してください。 – Olaf

+0

@Olaf編集しました、あなたの摂取に感謝します。 – techno

+0

ここで、uをbr =!0に設定しますか?さもなければあなたのループ 'for(i = 0; f-> br; i; i ++)'は決して実行されません。 –

答えて

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

エラーをマークします。あなたがNULLに*ザップ(FIRMA f = { "Lanaco",0, NULL };)を割り当て、あなたがNULLのアドレス値にアクセスしようとすると、f->zap[i].idあなたとの誤差も

を取得し、そのメモリアドレス(if (f->zap[i].id == z->id) x = true;)にアクセスしようとする機能(zaposli(&f, &z);)にそれを 送っzapは1つ以上のアドレス値を保持しなければならないので、structまたはZap ** zapにZap * zap [n]を定義する必要があります。あなたはザップ**としてザップ定義する場合は、まず、あなたは**ザップを割り当てる必要があります(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で1つのアドレスだけを保持し、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