簡體   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