c - 如何将 char* 设置为 char*?

标签 c string pointers

我遇到以下问题,我无法弄清楚如何将名为 funcNamechar* 分配给名为 char* 名称。需要一些帮助,谢谢。

#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 中的以 null 结尾的字符串复制到 funcName 中,如果字符串不是以 null 结尾或没有与该指针关联的内存,它将也会导致未定义的行为

注意:

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

只声明了一个指针 funcName 所以你应该在试图复制一个字符串之前使用 malloc 显式地分配一个内存,或者更好的是,使用一个带有 automatic 的缓冲区存储时间改为:

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

关于c - 如何将 char* 设置为 char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19647848/

相关文章:

c - C 中未指定存储类

c - 一个很好的引用卡/备忘单,其中包含 C 中的基本排序算法?

c - 标准定义了什么类型的双关语/指针魔术?

java - ArrayList<String>,String的HashMap不正常?

javascript - 根据项目索引附加序号后缀 ('-st' , '-nd' , '-rd' , '-th' )

c - 如果传递的函数也将函数作为参数,如何将函数作为参数传递给 C 中的函数?

c - iptables netfilter 队列 nfq_set_verdict_mark (nfq_set_verdict2) 似乎没有应用标记

比较 C 中两个设置位置(整数值)之间两个字符串的两个子字符串

c - C中的指针语法是什么意思?

C++ 全局字符指针?