更好地练习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);