我的程序中定义了几种数据类型,其中一种看起来像这样:
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);
}
最后,我想在代码中的其他地方使用这些结构和方法,但是当我使用字符串文字设置后检查名称时,即使在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);
为什么不再打印正确的字符串?
答案 0 :(得分:3)
在initVar
函数中,您会立即覆盖varPtr
变量,使其指向新分配的内存而不是&vars[0]
。函数中的所有内容都使用这个新分配的内存,包括最后一个printf,因此它可以正常工作。
不幸的是,这意味着您根本没有实际修改vars[0]
。当你从函数返回时,你泄漏了分配的内存,vars[0]
保持未初始化,因此是乱码。
如果您删除此行,您的程序代码段应该有效:
varPtr = (VarType *) calloc(1,sizeof(VarType));
然而,目前尚不清楚这是否是你一般要做的事情。
还有一些想法......
1)考虑使用union
代替int
value
。
2)声明varPtr->dType;
没有做任何事情,可以删除。
3)如果您尝试使用calloc
将结构清零,请尝试使用memset
。
答案 1 :(得分:1)
此:
VarType vars[3];
已初始化大小为3的VarType
数组类型。
下面:
varPtr = (VarType *) calloc(1,sizeof(VarType));
您正在覆盖vars[0]
1)删除varPtr = (VarType *) calloc(1,sizeof(VarType))
OR
2)不要在函数外声明VarType
,而是将函数类型更改为VarType
,以便它返回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;
}
答案 2 :(得分: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()
的那一行。
答案 3 :(得分:0)
删除此行,然后就可以了
varPtr = (VarType *) calloc(1,sizeof(VarType))
这会创建一个局部变量,在退出函数
时会自动销毁