AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76938398
Accepted
sdbbs
sdbbs
Asked: 2023-08-20 15:31:51 +0800 CST2023-08-20 15:31:51 +0800 CST 2023-08-20 15:31:51 +0800 CST

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

  • 772

我一直在研究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;
}
arrays
  • 1 1 个回答
  • 30 Views

1 个回答

  • Voted
  1. Best Answer
    tstanisl
    2023-08-20T15:35:43+08:002023-08-20T15:35:43+08:00

    全局变量在定义时初始化。做就是了:

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

    全局对象的地址是常量表达式,它们可用于初始化其他全局对象。参见6.6p7:

    初始值设定项中的常量表达式允许有更多的自由度。这样的常量表达式应为以下之一或计算结果为以下之一:

    • 算术常量表达式,
    • 空指针常量,
    • 地址常量,或
    • 完整对象类型的地址常量加上或减去整型常量表达式。

    “地址常量”的定义可以在6.6p9找到:

    地址常量是空指针、指向指定静态存储持续时间的对象的左值的指针或指向函数指示符的指针;它应使用一元 & 运算符或将整数常量转换为指针类型显式创建,或使用数组或函数类型的表达式隐式创建。数组下标 [] 和 member-access 。和 -> 运算符、地址 & 和间接 * 一元运算符以及指针强制转换可用于创建地址常量,但不得使用这些运算符来访问对象的值。

    • 2

相关问题

  • Swift Array,如何从数组中检索嵌套枚举中的所有元素

  • 为什么 C 字符串并不总是等同于字符数组?

  • PowerShell:如何像这样转换 hastable 数组值?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve