因此,我已经整理了这段代码,所以它的唯一目的是显示我遇到的问题:

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还是很陌生,还有很多我不真正了解的东西(它们的工作方式或为什么它们如此不直观) 。特别是字符串。

我还尝试过按照“在结构初始化程序中分配字符串数组”的方式来搜索各种短语,但是我发现的结果都与我的问题无关。

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 '\0' */},
               {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的更多信息。

10-07 18:13