我有一个问题,在这个问题中,我不知道如何将一个名为char*funcName分配给一个名为char*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*两种方法,但都不起作用;这两种方法都会导致分段错误。任何帮助都会有用的,谢谢。

最佳答案

FrameType *temp;
temp->funcName ...

取消引用未初始化的指针,这将产生未定义的行为,在本例中,您可以将其视为分段错误。可能的解决方案之一是使用具有自动存储持续时间的对象而不是指针:
FrameType temp;
temp.funcName ...

还要注意
temp->funcName = fname;

将指针fname的值(即指针指向的地址)分配给指针funcName,不执行复制,并且一旦与fname相关联的内存被释放,此temp->funcName将是无效(悬挂)指针,使用它也将导致未定义的行为。
另一方面:
strcpy(temp->funcName, fname);

尝试将fname中存储的以空结尾的字符串复制到funcName中,如果该字符串不是以空结尾的,或者没有与此指针关联的内存,则也会导致未定义的行为。
注意:
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;

10-06 05:05