0

呼び出された をchar*呼び出されたに割り当てる方法がわからないという次の問題があります。助けが必要です、ありがとう。funcNamechar*fname

#define MAX_PARMS 5

typedef enum {C_INT, C_SHORT, C_CHAR, C_FLOAT, C_INT_PTR} DataType;

typedef struct {
    char name;
    int *value;
    DataType dType;
} VarType;

typedef struct {
    char *funcName;
    VarType parms[MAX_PARMS];
    int numParms;
} FrameType;

void enterSumFunc (StackType *stkPtr, char *fname, int num, int *arr, int *sum) {
    FrameType *temp;
    //temp->funcName = fname;
    strcpy(temp->funcName, fname);
}

ご覧のとおり、両方を試してみましたがstrcpy、手動で設定しましたchar*が、何も機能しません。どちらもセグメンテーション違反を引き起こします。どんな助けでも役に立ちます、ありがとう。

4

2 に答える 2

1

tempは設定されていないため、逆参照 ( ->) は有効になりません。

編集されたコードに基づく (指定FrameType)

FrameType *temp = malloc(sizeof(FrameType));
temp->funcName = fname;

また

FrameType obj;
FrameType *temp = &obj;
temp->funcName = fname;

「動作」しますが、データの「浅いコピー」です。の「所有者」fnameがそれを削除または変更すると、tempオブジェクトは無効になります。を使用strdup()して名前をコピーするか、単なるポインタchar[]の代わりに a を挿入できます。FrameType

本当に一時的なものである場合temp(そして関数呼び出しの終了後も存続する必要がない場合) は、2 番目の方法がおそらく優れています。

または elase がmalloc必要になるたびに、メモリリークが発生することを忘れないでください。free上記の2番目のアプローチは、そのリスクを軽減します...

于 2013-10-29T01:03:19.940 に答える
1
FrameType *temp;
temp->funcName ...

初期化されていないポインターを逆参照するため、未定義の動作が発生します。この場合、セグメンテーション違反として観察できます。考えられる解決策の 1 つは、ポインターの代わりに自動保存期間を持つオブジェクトを使用することです。

FrameType temp;
temp.funcName ...

また、

temp->funcName = fname;

fnameポインターの値(つまり、ポインターが指すアドレス) をポインターに割り当てますfuncName。コピーは実行されず、関連付けられたメモリfnameが解放さtemp->funcNameれると、これは無効な (ダングリング) ポインターになり、それを使用すると未定義の動作が発生します。

一方で:

strcpy(temp->funcName, fname);

に格納されている null で終わる文字列をコピーしようとしfnamefuncName文字列が null で終了していない場合、またはこのポインターに関連付けられているメモリがない場合は、未定義の動作も発生します。

ご了承ください:

typedef struct {
  char *funcName;
  VarType parms[MAX_PARMS];
  int numParms;
} FrameType;

ポインターを宣言するだけなので、文字列をコピーする前にfuncName使用してメモリを明示的に割り当てるか、代わりに自動ストレージ期間を持つバッファーを使用する必要があります。malloc

typedef struct {
  char funcName[255];
  VarType parms[MAX_PARMS];
  int numParms;
} FrameType;
于 2013-10-29T01:05:15.490 に答える