Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更好地练习strcpy()或指向另一个数据结构?_C_Parsing_Interpreter - Fatal编程技术网

更好地练习strcpy()或指向另一个数据结构?

更好地练习strcpy()或指向另一个数据结构?,c,parsing,interpreter,C,Parsing,Interpreter,因为它总是更容易看到代码 我的解析器填充此对象: typedef struct pair { char* elementName; char* elementValue; } pair; 我的解释器想要读取该对象并填充该对象: typedef struct thing { char* label; } thing; 我应该这样做: thing.label = pair.elementName; 或者这个: thing.label = (char*)malloc(strlen(pair

因为它总是更容易看到代码

我的解析器填充此对象:

typedef struct pair {
 char* elementName;
 char* elementValue;
} pair;
我的解释器想要读取该对象并填充该对象:

typedef struct thing {
 char* label;
} thing;
我应该这样做:

thing.label = pair.elementName;
或者这个:

thing.label = (char*)malloc(strlen(pair.elementName)+1);
strcpy(thing.label, pair.elementName);
编辑:是的,我想我应该指定程序的其余部分将如何处理对象。我最终需要将“配对”保存到一个文件中。因此,当修改thing.label时,需要修改pair.elementName以匹配。因此,我认为前者是最好的方法?

从“对象”独立性的角度来看,最好是复制数据以避免指针悬空的问题


只分配指针会更高效、更快,但除非额外的性能非常关键,否则(从调试的角度来看)制作副本可能会更好。

我个人会做前者,但这是一种折衷。前者避免了分配新内存和向其中复制数据的需要,但后者通过保持
thing.label
pair.elementName
指向单独的内存地址来避免混淆别名,这意味着您需要释放这两个地址(对于前者,您需要确保只释放一个,以避免内存泄漏或双重释放)

对于这个问题没有好的答案,因为上下文太少。这完全取决于程序的其余部分如何管理它创建的对象的生存期。

答案总是“视情况而定”。如果您对“复制的”值正在读取它,只要您正确清理,就可以复制指针地址(即前者)。如果“复制的”值将以任何方式被修改,您将希望完全创建一个新字符串(即后者),以避免“原始”值更改引起的任何意外副作用(当然,除非这正是想要的效果)。

以下是回答这个问题需要知道的一些事情:

  • 哪个对象将“拥有”字符串?或者两者都将拥有其字符串(在这种情况下,需要“深度”副本)
  • 事物
    对象的生命周期是否以任何方式相关-一个对象是否总是“比”另一个对象“活得长”?这些对象中的一个是否拥有另一个对象
如果
对象
是独立的,那么复制字符串数据可能是正确的做法。如果一个对象属于另一个对象,那么这可能表明简单共享指针是合适的


并不是说这些是唯一可能的答案——只是几个简单的答案。

如果你想做一个拷贝,然后做所有的清理…在C语言中,你应该这样做:

thing.label = strdup(pair.elementName);

我不想成为c-police,但请使用更安全的
strncpy()
而不是
strcpy()


StncPy函数将最多的n个字符从S2复制到S1。< /P>我们不知道你的解释器,它如何处理你的“东西”……你标记了这个“C++”。如果你真的使用C++编译器,那么对实际最佳实践的回答可能是离开char和Maloc(+ 1)。如果你不写C代码,那么有大量C++抽象可以帮助你:字符串,它们自己的内存管理,自动/唯一指针,隐式共享类型……对象在程序的整个生命周期内生存。<代码> StrudU/S>是不标准的,虽然写起来容易。我的问题是反复计算strlen,如果可能的话,应该消除它。你是说C语言中没有标准化?这只是POSIX,是的。你说服我复制内存。谢谢。

char* strncpy(char *s1, const char *s2, size_t n);