我对爪哇很熟悉,在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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top