为什么在结构初始值设定项中为字符串数组成员赋值时会收到 "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 的更多信息。
所以我有这段代码,我已经归结为它的唯一目的是显示我遇到的问题:
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 的更多信息。