编写C函数返回char数组的正确方法是什么?
-
25-10-2019 - |
题
我对爪哇很熟悉,在C中不是。
在Java中,如果我有一种可以做某事并返回字符串的方法,则看起来像:
private String doSomething(...) {
String s;
// do something;
return s;
}
C中的句法等效语言是行不通的,并且是完全错误的:
char* doSomething(...) {
char s[100];
// do something;
return s;
}
我当然可以做:
char* doSomething(...) {
char *s;
s = malloc(100 * sizeof(char));
// do something;
return s;
}
哪个会起作用(我想!),但是我很少看到代码这样做(这是因为它不必要地填满了堆?)
最常见的是,我看到:
bool doSomething(char *s) {
// do something that copies chars to s
return true;
}
呼叫声明将是:
char s[100];
doSomething(s);
如果我在功能本身内部不知道字符阵列的大小怎么办?即,我将无法在功能之外声明字符阵列,然后将其传递。
会有什么 正确的 处理这种情况的方法?
解决方案
静态分配案例的一个示例(您有义务考虑编译时的最大缓冲区大小)
buf[MAX_NO];
do(buf, MAX_NO);
_Bool do(char *s, size_t len) {
// use len as boundary in your operations
}
或动态分配案例(如您所说,使用Malloc并使用指针来保存缓冲区的位置和大小)
char *s = NULL;
size_t final_len;
do(&s, &final_len);
_Bool do(char** s, size_t* final_len) {
size_t len = discoverSize();
char* buf = (char*) malloc(sizeof(char) * len);
*s = buf; //save memory location
*final_len = len; //save buffer size
// use len as boundary in your operations
}
// do whatever
free(s); //remember to free the buffer for politeness
其他提示
让呼叫代码负责分配内存。传递示例2中的缓冲区和缓冲区的长度:
bool doSomething(char *s, size_t buflen)
{
// do something that copies chars to s up to max of buflen
return true;
}
由于调用代码控制着内存管理,这往往会减少泄漏。
因为当您不知道返回的字符串的合适尺寸时,请使用 malloc
解决方案。当然你必须 free
弦,完成后。
您不能返回C中的数组。
你可以返回 指针 您应该学习(通过阅读好 书 在编程中 C 语言)阵列和指针之间的区别。
一个常见的成语是返回动态分配的指针。然后,您应该有一个约定告诉谁将释放指针。
您也可以返回包含数组的结构。
附加物
如果您想在C中有垃圾收集器,请尝试 Boehm的垃圾收集器
正如其他人所说,最安全的方法是将分配给呼叫者的责任。
但是,如果您不需要Java的重入代码和简单性,则C中的句法工作等同于:
char* doSomething(...) {
static char s[100];
// do something;
return s;
}
不隶属于 StackOverflow