因此,我已经整理了这段代码,所以它的唯一目的是显示我遇到的问题:
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的更多信息。