为什么在结构初始值设定项中为字符串数组成员赋值时会收到 "int-conversion" 警告?

Why am I getting an "int-conversion" warning when I assign a value to a string array member in a struct initializer?

所以我有这段代码,我已经归结为它的唯一目的是显示我遇到的问题:

typedef struct _TEST {char strarr[3][20];} TEST;

int main(int argc, char *argv[]) {
    char strarr[3][20] = {"some", "test", "strings"};
    TEST test = {.strarr=strarr};

    return 0;
}

当我尝试编译它时,我收到了这个警告:

$ gcc test.c -o test
test.c: In function ‘main’:
test.c:6:26: warning: initialization makes integer from pointer without a
cast [-Wint-conversion]
     TEST test = {.strarr=strarr};
                          ^
test.c:6:26: note: (near initialization for ‘test.strarr[0][0]’)

我尝试用谷歌搜索错误消息,但我得到的结果都是错误使用指针的人。我认为我没有错误地使用指针。我不认为我真的在这段代码中使用了指针,但我对 C 还很陌生,还有很多我不太了解的东西(它们是如何工作的或者为什么它们如此不直观) .尤其是字符串。

我也尝试使用谷歌搜索 "assigning a string array in a struct initializer," 的各种短语,但 none 我发现的结果与我的问题相关。

I did find something maybe relevant when I searched "near initialization for." 虽然它与我的问题没有特别相关,但我确实找到了一些有用的信息:他们收到警告是因为他们错误地初始化了变量。但是我不知道我做错了什么。

因为strarr是数组所以不能写成.strarr = strarr。因为数组不可赋值。所以你可以这样做:

test_s test = {
    .strarr = {{strarr[0][0],
                strarr[0][1] /* to strarr[0][x], x is the end of the string '[=10=]' */},
               {0 /* same for strarr[1] */},
               {0 /* strarr[2] */}}};

但是真的很痛苦。所以你可以使用 memcpy() 代替:

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

typedef struct
{
    char strarr[3][20];
} test_s;

int main(void)
{
    char strarr[3][20] = {"some", "test", "strings"};

    test_s test;
    memcpy(test.strarr, strarr, sizeof test.strarr);

    for (size_t i = 0; i < sizeof strarr / sizeof *strarr; i++) {
        printf("%s\n", test.strarr[i]);
    }
}

或者使用指针的指针。所以 test 只有在 strarr 也有效时才有效:

#include <stddef.h>
#include <stdio.h>

typedef struct
{
    char **strarr;
} test_s;

int main(void)
{
    char *strarr[] = {"some", "test", "strings"};

    test_s test = {.strarr = strarr};

    for (size_t i = 0; i < sizeof strarr / sizeof *strarr; i++) {
        printf("%s\n", test.strarr[i]);
    }
}

或者再次使用指针的指针,但分配内存,这样 test 可以在没有 strarr 的情况下生存:

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

typedef struct
{
    char **strarr;
} test_s;

int main(void)
{
    char *strarr[] = {"some", "test", "strings"};
    size_t const size_strarr = sizeof strarr / sizeof *strarr;

    test_s test = {.strarr = malloc(sizeof *test.strarr * size_strarr)};
    if (test.strarr == NULL) {
        return 1;
    }

    for (size_t i = 0; i < size_strarr; i++) {
        test.strarr[i] = malloc(sizeof *test.strarr[i] * (strlen(strarr[i]) + 1));
        if (test.strarr[i] == NULL) {
            return 1;
        }
        strcpy(test.strarr[i], strarr[i]);

        printf("%s\n", test.strarr[i]);
    }
}

有关 array 的更多信息。