可以初始化指向类型变量数组的指针吗?

问题描述 投票:0回答:1

我一直在研究 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
变量的地址(使用“地址”运算符,与符号
&
)。

但是,我想做的是 initialize

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;
}
arrays c pointers
1个回答
0
投票

全局变量在定义时初始化。只要这样做:

extern test_t my_arr[NUMITEMS];

test_t (*my_arr_ptr)[NUMITEMS] = &my_arr;

全局对象的地址是常量表达式,可以用来初始化其他全局对象。

© www.soinside.com 2019 - 2024. All rights reserved.