我有一个大字符串,我想使用它的一些片段,但我不想一定要复制它们,所以我想我可以制作一个标记有用块的开始和长度的结构从大字符串开始,然后创建一个读取它的函数。字符串的返回子字符串
struct descriptor {
int start;
int length;
};
到目前为止好,但是当我到写作,我意识到,我真的不能返回块而不复制到记忆功能......
char* getSegment(char* string, struct descriptor d) {
char* chunk = malloc(d.length + 1);
strncpy(chunk, string + d.start, d.length);
chunk[d.length] = '\0';
return chunk;
}
所以问题我有分别是:
- 有什么办法,我可以返回一条绳子但没有照搬
- 如果没有,我该怎么处理这个内存泄漏,因为我复制s在堆内存中,我无法控制谁会拨打
getSegment
?
你不能只是返回'字符串+ d.start'?唯一的问题是如果有人写入内存。其他问题将是空终止符,所以你可能需要通过传递新的子字符串 –
来管理它,而不会损坏原始字符串,什么都不做。你必须将没有空终止的子字符串复制到其他空格中以终止它。你无法处理泄漏(使用该界面);你必须依靠调用者正确处理分配的内存。你可以定义'char * getSegment(const char * source,struct descriptor d,char * output)',其中调用者在'output'参数中提供的空间必须至少为d.length + 1'字节的内存。当然,调用者也对该内存负责。 –
@JonathanLeffler什么是一个适当的接口,被调用者不需要处理内存管理? –