繁体   English   中英

C从函数返回const char指针或char指针

[英]C returning const char pointer or char pointer from a function

我想更好地理解这一点,所以我在这里问。 我编写了一个读取文件并以字符串形式返回内容的函数。 它当前被实现为返回char*因为它看起来更容易,但是我想知道这是否是正确的方法,因为许多使用char数组的C函数原型都将它们作为const char 我说它更容易的原因是,一旦您要读取const char读取了所有数据,就必须创建一个具有确切大小的新缓冲区,然后将数据复制到该缓冲区中,而不仅仅是重新分配缓冲区减小到正确的大小并返回在堆上分配的指针。

我的问题是,返回值应该是const char*还是char*

这是一些代码:

char *get_resource(char **res, const char *filename) {
    size_t count = ((strlen(resource_dir) + strlen(filename) + 1));
    *res = calloc(count, sizeof(char));
    strncpy(*res, resource_dir, resource_dir_len);
    strncat(*res, filename, strlen(filename));
    return *res;
}

或这一个:

char *read_file(char **data, const char *file_path) {
    FILE *fp;
    size_t buffer = 4096;
    size_t index = 0;
    int ch;

    fp = fopen(file_path, "r");
    if (fp == NULL) {
        printf("failed to open file: %s\n", file_path);
        return "-1\0";
    }

    (*data) = calloc(buffer, sizeof(char));
    while (EOF != (ch = fgetc(fp))) {
        (*data)[index] = (char)ch;
        ++index;
        if (index == buffer - 1) {
            buffer = buffer * 2;
            data = realloc(data, buffer);
            if (data != NULL) {
                printf("buffer not large enough, reallocating %zu bytes to "
                       "load %s\n",
                       buffer, file_path);
            } else {
                printf("failed to realloc %zu bytes to load %s\n", buffer,
                       file_path);
            }
        }
    }
    (*data) = realloc((*data), (sizeof(char) * (index + 1)));
    (*data)[index] = '\0';

    fclose(fp);
    return *data;
}

评论中已经解释了一些错误,我将不再重复,但建议您尽快修复。
现在,您必须在键入定义时考虑对函数内部和外部的数据的预期或要求的行为是什么。
在您的情况下,您需要在函数内部使用可更改的数据缓冲区,但在函数外部则需要使用不可更改的数据缓冲区。 澄清这一点,您可以随后键入该函数,然后使用强制转换:

const char *get_resource(const char** InRes, const char* filename)
{
    char *res;
    size_t count = ((strlen(resource_dir) + strlen(filename) + 1));
    if (*InRes)
    {
        res = realloc((void *)*InRes, count * sizeof(char));
        if (!res)
            return NULL;
    }
    else
    {
        res = calloc(count, sizeof(char));
        if (!res)
            return NULL;
    }
    *InRes = res;
    strcpy(res, resource_dir);
    strcat(res, filename);
    return res;
}

请注意在不需要强制类型转换的返回值上,因为使const成为数据并不违反数据的性质,而可能是相反的(例如使可变的常量数据成为可能)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM