2013-10-25 54 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]已经分配了内存,这应该是非常明显的。感谢您的洞察力! –