繁体   English   中英

C函数指针数组

[英]C array of function pointers

我有以下我不完全理解的代码:

void (*foo[ABC]) (int *i) {
    [A] = function1,
    [B] = function2,
    [C] = function3
}

其中ABC是整数常量。

1-如果以前没有定义ABC它是有效的声明吗?

2-这种初始化方式叫什么? [A] = function1;

3- foo[D]的值是什么? 它是空指针吗?

  1. 不,如果未定义ABCABC ,则将无法使用。
  2. 所谓的初始值设定项称为指定的初始值设定项 (自C99起,对于C90是GNU扩展和标准,感谢AndreyT)
  3. 只要D < ABCfoo[D]将为0(相当于NULL指针),否则它将是未定义的。

编辑 :由于现在的问题是,如果ABC Random和其他索引器是字符串,这意味着什么?答案要短得多:使用字符串作为数组索引是未定义的行为 ,它没有任何意义。

“我不认为它是C”不等同于“它不是C”。


感谢链接 ,@Kninnug -这是C99的可怕功能(以及C90的GNU扩展),并且代码有错误:这是对三个函数指针的数组的错误拼写的初始化。 我可以想象这样的固定代码:

#define ABC 3

#define A 0
#define B 1
#define C 2

void function1(int *i)
{
}

void function2(int *i)
{
}

void function3(int *i)
{
}

int main(int argc, char *argv[])
{
    void (*foo[ABC]) (int *i) = {
        [A] = function1,
        [B] = function2,
        [C] = function3
    };

    return 0;
}

这样编译

也:

foo[D]的值是什么? 它是空指针吗?

好吧, D什么? 如果D >= ABC (假设它们都是非负整数),则该元素甚至不存在。 如果D < ABC ,则它是一个NULL指针,因为聚合(结构,联合和数组)初始化隐式地初始化了初始化列表中没有相应初始化表达式的元素。

(更准确地说,它们被初始化为“好像它们具有static存储持续时间”,对于指针,则初始化为NULL 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM