【问题标题】:C program syntaxC 程序语法
【发布时间】:2021-01-21 18:34:55
【问题描述】:

我正在处理一个旧的 C 代码仓库,它有一些我从未见过的奇怪语法。

char (*__kaboom)[NUM_ELEMS( Port ) ] = NULL;

这是如何工作的? __kaboom 做什么?我们如何在打印语句中使用它?

还有其他类似的地方

char (*name)[MAX] = NULL;
name = (char (*)[MAX]) malloc(MAXB*sizeof(char));

我是 C 编程新手,感谢您的建议。 谢谢

【问题讨论】:

标签: arrays c pointers char


【解决方案1】:

很可能,NUM_ELEMS(Port) 是一个扩展为 (sizeof(Port)/sizeof(Port[0])) 或类似名称的宏。如果是这样,它只有在参数是源文件中定义的数组的名称(未声明 extern 并在另一个文件中定义)不是函数参数时才能正常工作。不管它是什么,它必须扩展为一个整数常量,或者什么都没有。

符号:

char (*variable)[SIZE] = NULL;

正在声明一个指向给定大小和类型的数组的指针,并将指针设置为NULL

第二个片段中的定​​义和演员表在概念上是相似的。

名称__kaboom 保留给实现使用。请注意,通常不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说:

  • 以下划线和大写字母或另一个下划线开头的所有标识符始终保留供任何使用。
  • 以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

另见What does double underscore (__const) mean in C?

【讨论】:

  • It only works properly when the argument is an array that is not a function parameter 没有:godbolt.org/z/nYaqG8
  • @0:你的链接显示了什么?我不去随机的网站,甚至 godbolt.com。我相信,对于学习 C 的人来说,我所说的是一个足够好的近似值。除非您想在评论中准确说明您的投诉是什么。
  • NUM_ELEMS(Port) 不一定是你想的那样
  • 咯咯笑...是的...在可能性的世界中,它可能是一个常量数组、一个查找表等...这就是为什么这个站点需要A Minimal, Complete, and Verifiable Example (MCVE)(建议:Don不要拉扯超人的斗篷——很少有好处……)
  • 只要在使用时知道数组的大小,宏就可以工作。如果数组声明了大小是可以的,如果数组声明没有大小并且定义在同一个文件中,但是在使用点之后,就不行了。
【解决方案2】:
  1. __kaboom定义为指向NUM_ELEMS( Port ) char元素数组的指针并将其初始化为NULL(BTW标识符不允许以__开头)
  2. name 定义为指向MAX char 元素数组的指针并将其初始化为NULL
  3. 从点 2. 开始分配指针,引用 malloc 函数分配的内存。

【讨论】:

    【解决方案3】:

    在此声明中

    char (*__kaboom)[NUM_ELEMS( Port ) ] = NULL;
    

    声明了一个指向char[NUM_ELEMS( Port ) ]类型数组的指针。

    这是一个演示程序。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void) 
    {
        char s[] = "Hello";
        
        char ( *p )[sizeof( s )] = NULL;
        
        p = ( char ( * )[sizeof( s )] )malloc( sizeof( char ) * sizeof( s ) );
        
        strcpy( *p, s );
        
        puts( *p ); 
    
        free( p );
        
        return 0;
    }
    

    程序输出是

    Hello
    

    如果你有一个类似的数组

    char s[N];
    

    那么指向这样一个数组的指针可以声明为

    char ( *p )[N] = &s;
    

    或者您可以将char[N](或您的示例中的char [MAX])类型的数组的动态分配内存的地址分配给指针

    p = ( char ( * )[N] ) malloc( N * sizeof( char ) );
    

    解引用指针你会得到指向的数组(左值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2012-12-04
      • 1970-01-01
      • 2016-10-08
      • 2022-01-21
      相关资源
      最近更新 更多