我一直在研究c 指向结构数组的指针,并尝试将其应用到我的示例中。
我得到了这个代码片段,它编译得很好:
#include <stdio.h>
enum test_e {
eONE,
eTWO,
eTHREE,
};
typedef enum test_e test_t;
#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];
test_t (*my_arr_ptr)[NUMITEMS];
test_t my_arr[NUMITEMS] = { 0 };
int main()
{
my_arr_ptr = &my_arr;
printf("Hello World %p\n", my_arr_ptr);
return 0;
}
在上面的代码片段中,我们将变量赋值my_arr_ptr
给变量的地址my_arr
(使用“address of”运算符, & &
)。
但是,我想做的是将变量初始化 my_arr_ptr
为变量的地址my_arr
- 我认为这是可能的,因为在该行之后test_t my_arr[NUMITEMS] = { 0 };
编译器应该“知道” 的地址和大小my_arr
。
但是,如果我尝试这样做:
#include <stdio.h>
enum test_e {
eONE,
eTWO,
eTHREE,
};
typedef enum test_e test_t;
#define NUMITEMS 12
extern test_t my_arr[NUMITEMS];
test_t (*my_arr_ptr)[NUMITEMS];
test_t my_arr[NUMITEMS] = { 0 };
my_arr_ptr = &my_arr;
int main()
{
//my_arr_ptr = &my_arr;
printf("Hello World %p\n", my_arr_ptr);
return 0;
}
...这失败了:
Compilation failed due to following error(s).
main.c:25:1: warning: data definition has no type or storage class
25 | my_arr_ptr = &my_arr;
| ^~~~~~~~~~
main.c:25:1: warning: type defaults to ‘int’ in declaration of ‘my_arr_ptr’ [-Wimplicit-int]
main.c:25:1: error: conflicting types for ‘my_arr_ptr’; have ‘int’
main.c:21:10: note: previous declaration of ‘my_arr_ptr’ with type ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’}
21 | test_t (*my_arr_ptr)[NUMITEMS];
| ^~~~~~~~~~
main.c:25:14: warning: initialization of ‘int’ from ‘test_t (*)[12]’ {aka ‘enum test_e (*)[12]’} makes integer from pointer without a cast [-Wint-conversion]
25 | my_arr_ptr = &my_arr;
| ^
main.c:25:14: error: initializer element is not computable at load time
main.c: In function ‘main’:
main.c:30:26: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’ [-Wformat=]
30 | printf("Hello World %p\n", my_arr_ptr);
| ~^ ~~~~~~~~~~
| | |
| | int
| void *
| %d
据我所知,出现“警告:数据定义没有类型或存储类”:
因为你无法在函数之外执行代码
(为什么我会收到此错误:“数据定义没有类型或存储类”?)
那么,在C中获取“地址”是否被视为“代码”,因此我不能在函数之外使用它?
如果是这样,我为什么可以在下面的代码片段中使用“地址”运算符“外部函数”,它也可以正常编译?:
#include <stdio.h>
void func_one(void) {
printf("func_one\n");
}
void func_two(void) {
printf("func_two\n");
}
void* funcs_arr[2] = { &func_one, &func_two };
int main()
{
printf("Hello World %p\n", funcs_arr[0]);
return 0;
}
全局变量在定义时初始化。做就是了:
全局对象的地址是常量表达式,它们可用于初始化其他全局对象。参见6.6p7:
“地址常量”的定义可以在6.6p9找到: