2016-04-06 39 views
-1

Oluşturucunun bob kodunu yaptım, bu yapı, her bob yapıcının adı ve iki tam sayı daha var (gerçekten önemli değil). Üç fonksiyonları İşaretçileri kullanarak yapıları yanlış olsun

  1. yapı başlatmak

    vardır ("bob" ve 0 ile ve 3)

  2. İkinci fonksiyon iki yapılarını almak ve bu yapılar arasında kopyalamak için ihtiyacı var

  3. üçüncü Fonksiyon her bob'un isimlerini (char *) serbest bırakmaktır.

Öncelikle, ikinci fonksiyon (kopya) (neden oldu analizinde yardımına ihtiyacım) o isim kopyalamak çünkü hata ayıklama yanlış gitti ve ikinci olarak, kod serbest fonksiyonu düştü. Birisi bana yapıların isimlerini (char *) nasıl serbest bırakabileceğini söyleyebilir mi? initBob yılında

#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

[bu tartışma üzerine bakın neden c değil malloc() 've ailesinin' C' cinsinden dönüş değeri. (http://stackoverflow.com/q/605845/2173917). –

+0

sadece daha kötüye gidemeyeceğini düşündüğünüz zaman, 'strncpy' sizi –

+0

bağırsaklarına atıyor. Google "neden strncpy güvensiz" dir. – Lundin

cevap

3

sahip:

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

bir yerel otomatik değişken işaret edecek currBob->name setleri Yani. Dinamik olarak ayrılmış arabelleğe değil. İşlevden çıkıldığında ve bu nedenle artık geçerli olmadığında otomatik değişken kapsam dışıdır. Ve elbette, dinamik olarak ayrılmış bellek olmadığı için serbest bırakılamaz.

Orada ne yapmaya çalıştığınızdan emin değilim. Yerel bir değişkene işaret etmek için str'un yanlış ayarlanması yanı sıra, gereksiz bir strcat var. Tahminimce NUL arabelleği sonlandırmaya çalışıyorsunuz. Ancak bu, bir dizgi literaliyle bir boyutlandırılmamış bir char dizisinin başlatılmasının NUL sona erdirilmesini garantilemek için gereksizdir. o gerçekten kapsamı ise bunu ya öğrenmek sadece basit bir örnek ise

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

Bilmiyorum ama: akılda bu konular ile

, initBob işlevi daha gibi olmalıdır Bu kullanım yapmanız gerekiyorsa: strdup()

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

Eğer malloc() dize ... standart ANSI olduğu için, bir yerlerde) (o özgür gerektiğinden daha