我正在处理一个旧的C代码库,其中有一些我从未见过的奇怪语法。
char (*__kaboom)[NUM_ELEMS( Port ) ] = NULL;
这是如何工作的?__kaboom做什么,我们如何使用它,例如在打印语句中?
和其他类似的地方
char (*name)[MAX] = NULL;
name = (char (*)[MAX]) malloc(MAXB*sizeof(char));
我是C编程新手,感谢您的建议。由于最有可能的是,NUM_ELEMS(Port)
是一个扩展为(sizeof(Port)/sizeof(Port[0]))
或类似内容的宏。如果是这样,只有当参数是源文件(未声明extern
并在另一个文件中定义)中定义的数组的名称而不是函数参数时,它才能正常工作。无论它是什么,它必须展开为一个整型常量,或者不展开。
标记:
char (*variable)[SIZE] = NULL;
是声明一个指向给定大小和类型的数组的指针,并将指针设置为NULL
。
第二个片段中的定义和强制转换在概念上是相似的。
名称__kaboom
保留给实现使用。注意,通常不应该创建以下划线开头的函数、变量、标记或宏名称。C11§7.1.3保留标识符的一部分说:
- 所有以下划线、大写字母或另一个下划线开头的标识符始终保留用于任何用途。
- 所有以下划线开头的标识符始终保留在普通和标记名称空间中作为文件范围的标识符使用。
参见双下划线(__const
)在C中是什么意思?
- 定义
__kaboom
作为指向NUM_ELEMS( Port )
char元素数组的指针,并将其初始化为NULL (BTW标识符不允许以__
开头) - 定义
name
作为指向MAX
char元素数组的指针并初始化为NULL - 从
2.
点指定指向malloc函数分配的内存的指针。
在此声明
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 ) );
对指针解引用将得到指向数组(左值)。