如何通过结构访问 char* 的二维数组?

How to access to 2D array of char* through structure?

这是一个 char* 的二维数组,例如存储不同语言的不同字符串:

typedef enum
{
    FRENCH,
    ENGLISH,
    GERMAN,
    LANGUAGES_COUNT
} languages_t;

typedef enum
{
    HELLO,
    THANK_YOU,
    WORDS_COUNT
} words_t;


char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
{
    {"bonjour", "hello", "guten tag"},
    {"merci", "thank you", "danke"}
};

访问它没有问题:

int main()
{
    printf("%s\n", text_tab[HELLO][ENGLISH]);
    printf("%s\n", text_tab[THANK_YOU][FRENCH]);
    printf("%s\n", text_tab[HELLO][GERMAN]);
   return 0;
}

现在,我不想直接访问text_tab,而是通过一个结构:

typedef struct
{
  int a;
  char ***txt; // here is not working
} test_t;

test_t mystruct = {5, text_tab};

想法是这样访问 text_tab :

printf("%s\n", mystruct.txt[BONJOUR][ANGLAIS]);
printf("%s\n", mystruct.txt[MERCI][FRANCAIS]);
printf("%s\n", mystruct.txt[BONJOUR][ALLEMAND]);

如何在结构中声明字段“txt”? 我只使用静态分配,我不想在“txt”中复制“text_tab”的内容,只需使用指针即可。

谢谢。

这个数组

char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
{
    {"bonjour", "hello", "guten tag"},
    {"merci", "thank you", "danke"}
};

具有类型 char * [WORDS_COUNT][LANGUAGES_COUNT]

因此指向数组元素的指针具有类型 char * ( * )[LANGUAGES_COUNT]

因此结构可以这样声明

typedef struct
{
  size_t a;
  char * ( *txt )[LANGUAGES_COUNT];
} test_t;

并且在 main 中你可以声明一个结构类型的对象,如

test_t mystruct = { sizeof( text_tab ) / sizeof( *text_tab ), text_tab };

这是一个演示程序。

#include <stdio.h>

#define WORDS_COUNT     2
#define LANGUAGES_COUNT 3

typedef struct
{
    size_t a;
    char * ( *txt )[LANGUAGES_COUNT];
} test_t;

int main(void) 
{
    char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
    {
        {"bonjour", "hello", "guten tag"},
        {"merci", "thank you", "danke"}
    };
    
    test_t mystruct = { sizeof( text_tab ) / sizeof( *text_tab ), text_tab };
    
    for ( size_t i = 0; i < mystruct.a; i++ )
    {
        for ( size_t j = 0; j < sizeof( *mystruct.txt ) / sizeof( **mystruct.txt ); j++ )
        {
            printf( "%s ", mystruct.txt[i][j] );
        }
        putchar( '\n' );
    }
    
    return 0;
}

程序输出为

bonjour hello guten tag 
merci thank you danke