存储在struct中的字符串打印错误

时间:2013-10-25 02:40:32

标签: c string struct char

我的程序中定义了几种数据类型,其中一种看起来像这样:

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);

为什么不再打印正确的字符串?

4 个答案:

答案 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))

这会创建一个局部变量,在退出函数

时会自动销毁