2013-10-25 52 views
1

我在程序中定義的幾種數據類型,其中一個看起來是這樣的:字符串存儲在結構打印不正確

typedef struct { 
    char  name[MAX_STR]; 
    int  value; 
    DataType dType; 
} VarType; 

而且我想「初始化」使用我定義它的功能如下:

void initVar(VarType *varPtr, char *name, int *val, DataType d) 
{ 
    varPtr = (VarType *) calloc(1,sizeof(VarType)); 
    strcpy(varPtr->name, name); 
    varPtr->dType; 

    /* we have to store it differently depending on the type, be careful! */ 
    if(d==C_INT_PTR) 
    varPtr->value = (int)(val); 
    else if(d==C_INT) 
    varPtr->value = *val; 

    /* NOTE THE FOLLOWING LINE */ 
    printf("The variable name prints properly here: %s\n", varPtr->name); 
} 

最後,我想在代碼中的其他地方使用這些結構和方法,但是當我檢查,我使用字符串文字設置後它的名字,它打印jibberish即使initVar()函數內它打印完美。

/* let's store the variables we're gonna put in the frame */ 
VarType vars[3]; 

initVar(&vars[0], "num", &num, C_INT); 
/* NOTE THE FOLLOWING LINE */ 
printf("This one prints like jibberish: %s\n",vars[0].name); 

爲什麼不打印正確的字符串了?

回答

3

在您的initVar函數中,您立即覆蓋varPtr變量,以使其指向新分配的內存而不是&vars[0]。函數中的所有內容都使用這個新分配的內存,包括最後一個printf,因此它可以正常工作。

不幸的是,這意味着你根本沒有修改vars[0]。當您從函數返回時,會泄漏分配的內存,並且vars[0]保持未初始化狀態,因此會出現亂碼。如果您刪除此行

你的程序段應工作:

varPtr = (VarType *) calloc(1,sizeof(VarType)); 

目前還不清楚,但是,如果這是你想在一般做什麼。

一些更多的想法...

1)考慮使用一個union,而不是一個intvalue

2)聲明varPtr->dType;不做任何事情,可以刪除。 3)如果您嘗試使用calloc來清零該結構,請嘗試使用memset代替。

+0

很棒的工作!我會使用union,但是這是爲了學校,我被要求使用int。無用的varPtr-> dType;聲明是一個錯誤,我最初將它分配給它,但刪除了那部分代碼以進行調試。謝謝你指出!而且我完全不能動態分配內存,我從未在最終代碼中使用calloc或malloc。 –

0

此:

varPtr = (VarType *) calloc(1,sizeof(VarType)); 

創建一個本地指針varPtr,它獲取你的函數退出時被破壞。這就是爲什麼它在你的函數中打印OK,但不在調用者中。您需要將指針傳遞給它,如:

void initVar(VarType ** varPtr, char *name, int *val, DataType d) 
{ 
    VarType * temp_varPtr = calloc(1,sizeof(VarType)); 

    /* Rest of function */ 

    *varPtr = temp_varPtr; 
} 

你的功能有很多其他錯誤,不過,不是其中最重要的是,你設置的VarType數組你打電話之前,然後嘗試calloc()設置陣列時已經分配的內存。你應該用calloc()去掉那條線。

0

刪除這條線,那麼它將確定

varPtr = (VarType *) calloc(1,sizeof(VarType)) 

這就產生了一個局部變量,在退出功能

1

此時自動銷燬:

VarType vars[3]; 

已經初始化的陣列型VarType,尺寸爲3.

這裏:

varPtr = (VarType *) calloc(1,sizeof(VarType)); 

要覆蓋vars[0]

1)刪除varPtr = (VarType *) calloc(1,sizeof(VarType))

OR

2),而不用聲明VarType之外的功能,改變功能型到VarType,這樣它會返回a VarType指針

如:

VarType* initVar(char *name, int *val, DataType d) 
{ 
    VarType* varPtr = (VarType *) calloc(1,sizeof(VarType)); 
    strcpy(varPtr->name, name); 
    varPtr->dType; 

    /* we have to store it differently depending on the type, be careful! */ 
    if(d==C_INT_PTR) 
    varPtr->value = (int)(val); 
    else if(d==C_INT) 
    varPtr->value = *val; 

    /* NOTE THE FOLLOWING LINE */ 
    printf("The variable name prints properly here: %s\n", varPtr->name); 
    return varPtr; 
} 
+0

你給了我多個選項,所以+1。我正在考慮讓initVar返回一個指向VarType的指針,特別是因爲這會讓它「感覺」更像是面向對象的語法,但我最終決定偏離它。我也從來沒有意識到VarType vars [3]已經分配了內存,這應該是非常明顯的。感謝您的洞察力! –