如何将char *设置为char *?

时间:2013-10-29 01:01:21

标签: c string pointers

我遇到以下问题:我无法弄清楚如何将名为char*的{​​{1}}分配给名为funcName的{​​{1}}。需要一些帮助,谢谢。

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); } ,但没有任何效果;两者都给出了分段错误。任何帮助都会有用,谢谢。

2 个答案:

答案 0 :(得分:1)

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

基于已编辑的代码(指定FrameType

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

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

将“工作”,但它是数据的“浅层副本”。如果fname的“所有者”将其删除或更改,则您的temp对象将失效。您可以使用strdup()复制名称,也可以在char[]中添加FrameType而不是指针。

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

请记住每个malloc您需要一个free,否则您将泄漏内存。上面显示的第二种方法降低了风险......

答案 1 :(得分:1)

FrameType *temp;
temp->funcName ...

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

FrameType temp;
temp.funcName ...

另请注意

temp->funcName = fname;

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

另一方面:

temp->funcName

尝试将存储在strcpy(temp->funcName, fname); 中的以null结尾的字符串复制到fname,如果字符串未终止或者没有与此指针关联的内存,则会导致 undefined行为

请注意:

funcName

只声明指针typedef struct { char *funcName; VarType parms[MAX_PARMS]; int numParms; } FrameType; 所以你应该在尝试将字符串复制到它之前使用funcName显式分配内存,或者更好,使用具有自动存储持续时间的缓冲区:

malloc