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()来复制名称,也可以将 achar[]放入FrameType而不只是指针。

如果temp真的是临时的(并且不必超过函数调用的结尾),那么第二种方法可能更好。

请记住,对于每个malloc您需要的 afree或 elase,您都会泄漏内存。上面显示的第二种方法降低了这种风险......

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

取消引用未初始化的指针,这会产生未定义的行为,在这种情况下,您可以将其视为分段错误。一种可能的解决方案是使用具有自动存储持续时间的对象而不是指针:

FrameType temp;
temp.funcName ...

另请注意

temp->funcName = fname;

将指针的值fname(即它指向的地址)分配给指针funcName,不执行复制,一旦相关的内存fname被释放,这temp->funcName将是一个无效的(悬空)指针,使用它也会导致未定义的行为

另一方面:

strcpy(temp->funcName, fname);

尝试将存储的以空字符结尾的字符串复制fnamefuncName,如果字符串不是以空字符结尾或没有与此指针关联的内存,也会导致未定义的行为

注意:

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 回答