2016-04-06 10 views
-1

私はビルドのコードをビルダーにしました。それは構造体であり、ビルドには名前と2つの整数があります(実際には関係ありません)。三つの機能ポインタを使った構造が間違っている

  1. があります(「ボブ」と0とし、3)構造体を初期化

  2. 第二の機能は、2つの構造体を取得し、第三

  3. これらの構造の間でコピーする必要があります関数はすべてのボブの名前(char *)を解放することです。

まず、第二の機能(コピー)は、(それがなぜ起こったか分析することであなたの助けが必要です)、それは名前をコピーしなかったため、デバッグ中に間違っていた、第二に、コードがフリー機能に墜落しました。誰かが構造の名前(char *)を解放する方法を教えてもらえますか? initBob

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define LENGTH_OF_BOB 4 

typedef struct bobTheBuilder 
{ 
    char* name; 
    int fixed; 
    int maxFix; 
}bob; 

//typedef struct bobTHeBuilder bob; 

void deleteBob(bob currBob); 
void initBob(bob *currBob); 
void copyStruct(bob* dst, bob src); 
int main(void) 
{ 
    bob currBob = {0,0,0}; 
    bob secondBob; 
    initBob(&currBob); 
    copyStruct(&secondBob, currBob); 
    deleteBob(currBob); 
    deleteBob(secondBob); 
    system("PAUSE");  
    return 0; 
} 
/* 
*/ 
void initBob(bob *currBob) 
{ 
    char* str = (char*)calloc(LENGTH_OF_BOB, sizeof(char)); 
    char string[] = "bob"; 
    if (str) 
    { 
     strcat(string, "\0"); 
     str = string; 

     currBob->name = str; 
     currBob->fixed = 0; 
     currBob->maxFix = 3; 
    } 
} 
/* 
*/ 
void deleteBob(bob currBob) 
{ 
    free(currBob.name); 
} 
void copyStruct(bob* dest, bob src) 
{ 
    dest->fixed = src.fixed; 
    dest->maxFix = src.maxFix; 
    dest->name = (char*)malloc(sizeof(char) *LENGTH_OF_BOB); 
    strncpy(dest->name, src.name, LENGTH_OF_BOB); 
} 
+0

ある[上のこの議論を参照してください。なぜではない'malloc()'の戻り値と 'C 'のファミリです。](http://stackoverflow.com/q/605845/2173917)。 –

+0

あなたがそれが悪くならないと思ったときに、 'strncpy'はあなたの腸の中であなたをキックします –

+0

確かに。 Googleは "なぜstrncpyは危険ですか"。 – Lundin

答えて

3

あなたが持っている:

char* str = (char*)calloc(LENGTH_OF_BOB, sizeof(char)); 
char string[] = "bob"; 
str = string; 
currBob->name = str; 

ローカル自動変数を指すようにcurrBob->nameを設定されること。ダイナミックに割り当てられたバッファではありません。自動変数は、関数が終了するときに範囲外になり、もはや有効ではなくなります。もちろん、動的に割り当てられたメモリではないため、解放することはできません。

私は実際にあなたが何をしようとしているのか分かりません。ローカル変数を指すように間違ってstrを設定するだけでなく、不要なstrcatもあります。私は、NULがバッファを終了しようとしていると思います。しかし、文字列リテラルでNUL終了を保証している未定義のchar配列を初期化することは不要です。心の中でこれらの問題に

initBob機能は、より多くのようにする必要があります:それは本当にあなたの範囲であればそれを行うか、どのように学習するだけの簡単な例であれば、私は知らない

void initBob(bob *currBob) 
{ 
    currBob->name = calloc(LENGTH_OF_BOB, sizeof(char)); 
    if (currBob->name) 
    { 
     strcpy(currBob->name, "bob"); 
     currBob->fixed = 0; 
     currBob->maxFix = 3; 
    } 
} 
0

が、あなたはこの使用を行う必要がある場合:のstrdupあなたが(解放するために持っているよりも()

void initBob(bob *currBob) 
{ 
if (currBob->name) 
{ 
    currBob->name=strdup("bob"); 
    currBob->fixed = 0; 
    currBob->maxFix = 3; 
} 
} 

を)それがどこかに、文字列のmalloc()ので...それは、ANSI標準

関連する問題