为什么从函数返回指向非常量字符的指针作为指向 C 中常量字符的指针会导致“不兼容的返回类型”?

问题描述 投票:0回答:1

在 C 中,我尝试实现动态字符串数组(很像 C++

std::vector<std::string>
),灵感来自 https://stackoverflow.com/a/3536261/2690527

目前我的代码看起来像

string_array.h

#ifndef _STRING_ARRAY_H_
#define _STRING_ARRAY_H_

struct string_array_t;

struct string_array_t* create_string_array( size_t capacity );

void free_string_array( struct string_array_t* array );

char const * const * get_string_array( struct string_array_t const * array );

#endif

string_array.c

#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#include "string_array.h"

struct string_array_t {
    size_t capacity;
    size_t size;
    char** values;
};

struct string_array_t* create_string_array( size_t capacity ) {
    // ... left out ...
}

void free_string_array( struct string_array_t* array ) {
    // ... left out ...
}

char const * const * get_string_array( struct string_array_t const * array ) {
    return array->values;
}

函数

get_string_array
会生成编译器错误。 我希望该函数为调用者提供对底层数组的直接访问,但防止调用者(意外地)弄乱内部数据结构。

因此,我想返回我认为的(从右到左读取)指向常量字符的常量指针(数组的开头)的指针。

错误信息是:

从结果类型为

char **const
的函数返回
const char * const *
会丢弃嵌套指针类型中的限定符

为什么我会收到这条消息?恕我直言,这应该没问题,因为我不会丢弃任何

const
,而是添加更多
const

c pointers const-correctness
1个回答
0
投票
char const * const * get_string_array

是指向 const 的指针 指向 const char 的指针,与

char **

不兼容

我希望该函数能够为调用者提供直接访问 底层数组,但防止调用者(意外地)弄乱 具有内部数据结构。

那么您正在寻找:

char * const * get_string_array

指向char的const指针,这样,指针和内容都受到保护(只读),一个简化的例子:

#include <stdio.h>
#include <stdlib.h>

char * const * foo(void)
{
    char **values = malloc(sizeof *values * 2);

    values[0] = "zero";
    values[1] = "one";
    return values;
}

int main(void)
{
    char * const * values = foo();                                                                                                             

    printf("%s\n", values[0]); // ok
    printf("%s\n", values[1]); // ok
    values[0] = "zero"; // fail
    values[0][0] = 'z'; // fail
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.