【发布时间】:2017-07-28 14:44:54
【问题描述】:
我有一个大字符串,我想在其中使用它的片段,但我不想复制它们,所以我想我可以制作一个结构来标记大字符串中有用块的开头和长度,然后创建一个读取它的函数。
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;
}
所以我的问题是:
- 有什么方法可以在不复制的情况下返回该字符串
- 如果没有,我该如何处理这种内存泄漏,因为副本在堆内存中,我无法控制谁将调用
getSegment?
【问题讨论】:
-
能不能不直接回
string + d.start?唯一的问题是如果有人要写入内存。其他问题是空终止符,因此您可能需要通过将 d 与新的子字符串一起传递来管理它 -
不破坏原字符串,什么都不做。您必须将没有空终止的子字符串复制到其他空间以空终止它。您无法处理泄漏(使用该接口);您必须依靠调用者正确处理分配的内存。您可以定义
char *getSegment(const char *source, struct descriptor d, char *output),其中调用者在output参数中提供的空间必须至少为d.length+1字节的内存。当然,调用者也要对那段内存负责。 -
@NeilLocketz “唯一的问题是......其他问题是”金:D
-
C 中没有可用的选项,调用者不必管理内存,除非您有垃圾收集,这并不常见并且完全改变了一切。在 C 中,您接受内存管理的责任。你可以设计一个更复杂的字符串结构,包括一个指针和管理这些字符串的函数,你可以有一个函数从其中一个字符串中提取一个子字符串,但是调用者仍然负责调用字符串释放函数。库中的代码无法判断调用代码何时完成了它提供的内容。
-
代码不应该尝试
string + d.start,因为string不知道指向在该长度内有效的内存——即使string很大,d.start可能更大。首先找到strlen(string)以避免这种情况。
标签: c string memory-management