首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >写一个返回char数组的C函数的正确方法是什么?

写一个返回char数组的C函数的正确方法是什么?
EN

Stack Overflow用户
提问于 2011-11-29 21:00:12
回答 5查看 1.4K关注 0票数 16

我对Java很熟悉,但用C就不太熟悉了。

在Java中,如果我有一个执行某些操作并返回一个字符串的方法,它将如下所示:

代码语言:javascript
复制
private String doSomething(...) {
    String s;
    // do something;
    return s;
}

C中的语法等价物将不起作用,而且是完全错误的:

代码语言:javascript
复制
char* doSomething(...) {
    char s[100];
    // do something;
    return s;
}

我当然可以这样做:

代码语言:javascript
复制
char* doSomething(...) {
    char *s;
    s = malloc(100 * sizeof(char));
    // do something;
    return s;
}

这将会起作用(我想!)但是我很少看到代码这样做(是不是因为它不必要地填满了堆?)

最常见的是,我看到:

代码语言:javascript
复制
bool doSomething(char *s) {
    // do something that copies chars to s
    return true;
}

而调用语句将是:

代码语言:javascript
复制
char s[100];
doSomething(s);

如果我直到函数内部才知道char数组的大小,该怎么办?也就是说,我不能在函数外部声明char数组,然后再将其传入。

处理这种情况的正确方法是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-29 21:18:52

静态分配情况的一个示例(您必须考虑编译时的最大缓冲区大小)

代码语言:javascript
复制
buf[MAX_NO];
do(buf, MAX_NO);

_Bool do(char *s, size_t len) { 
// use len as boundary in your operations
}

或动态分配情况(如您所说,使用malloc并使用指针保存缓冲区的位置和大小)

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2011-11-29 21:02:26

让调用代码负责分配内存。在示例2中传入缓冲区和缓冲区的长度:

代码语言:javascript
复制
bool doSomething(char *s, size_t buflen)
{ 
    // do something that copies chars to s up to max of buflen
    return true; 
} 

这往往会减少泄漏,因为调用代码控制着内存管理。

票数 19
EN

Stack Overflow用户

发布于 2011-11-29 21:03:45

当您不知道返回字符串的正确大小时,可以使用malloc解决方案。当然,在使用完字符串之后,您必须对其执行free操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8311131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档