繁体   English   中英

如何将char *设置为char *?

[英]How do I set char* to char*?

我有以下问题,我无法弄清楚如何将分配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*但没有任何作用; 两者都给出了分段错误。 任何帮助都会有用,谢谢。

temp未设置,因此取消引用它( -> )永远不会有效。

基于编辑的代码(指定FrameType

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

要么

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

将“工作”,但它是数据的“浅层副本”。 如果fname的“owner”删除它或更改它,那么你的temp对象将变为无效。 您可以使用strdup()复制名称,也可以在FrameType放置char[]而不是指针。

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

请记住,对于每个malloc你需要一个free或者你会泄漏记忆。 上面显示的第二种方法降低了风险......

FrameType *temp;
temp->funcName ...

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

FrameType temp;
temp.funcName ...

另请注意

temp->funcName = fname;

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

另一方面:

strcpy(temp->funcName, fname);

尝试将存储在fname以null结尾的字符串复制到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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM