1

私のプログラムにはいくつかのデータ型が定義されており、そのうちの 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);
}

最後に、これらの構造体とメソッドをコードの別の場所で使用したいのですが、文字列リテラルを使用して名前を設定した後に名前を確認すると、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

4 に答える 4

1

これ:

VarType vars[3];

VarTypeサイズが 3 の配列型をすでに初期化しています。

ここ:

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

を上書きしていますvars[0]

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

また

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;
}
于 2013-10-25T03:25:26.823 に答える
0

この行を削除すると、問題ありません

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

これにより、関数を終了するときに自動破棄されるローカル変数が作成されます

于 2013-10-25T03:05:01.413 に答える