我对Java很熟悉,但用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);
如果我直到函数内部才知道char数组的大小,该怎么办?也就是说,我不能在函数外部声明char数组,然后再将其传入。
处理这种情况的正确方法是什么?
发布于 2011-11-29 21:18:52
静态分配情况的一个示例(您必须考虑编译时的最大缓冲区大小)
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
发布于 2011-11-29 21:02:26
让调用代码负责分配内存。在示例2中传入缓冲区和缓冲区的长度:
bool doSomething(char *s, size_t buflen)
{
// do something that copies chars to s up to max of buflen
return true;
}
这往往会减少泄漏,因为调用代码控制着内存管理。
发布于 2011-11-29 21:03:45
当您不知道返回字符串的正确大小时,可以使用malloc
解决方案。当然,在使用完字符串之后,您必须对其执行free
操作。
https://stackoverflow.com/questions/8311131
复制相似问题