在 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
。
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;
}