如果有人知道的话,我只需要一个明确的答案 我已经检查了类似的问题,但没有一个澄清多维数组中发生的事情。所以,
typedef u_char block[16];
block *array = (block*) somePointer;
我正在尝试将 bytes 的流读取为块数组
同样,每个元素的大小都只有1个字节,所以不要试图让我更加混淆我的尺寸和元素
我假设(希望)变量array
已成为块数组。
array[n][16];
如何确定n
??的值?有限吗?
一些测试表明:
sizeof(array) == 4; // n != sizeof (array)
sizeof(*array) == 16; // n != sizeof (*array)
答案 0 :(得分:1)
TL / DR版
您将无法使用n
变量计算单个表达式中的array
。指向T
的指针仅指向T
的单个实例;它无法知道该实例是否是T
数组的第一个元素。
长版
鉴于声明
typedef u_char block[16];
block *array = (block*) somePointer;
以下是真的:
Expression Type
---------- ----
array block * == u_char (*)[16] // pointer to 16-element array of u_char
*array block == u_char [16]
sizeof array size_t == sizeof (block *) == sizeof (u_char (*)[16]) == 4 // on your system
sizeof *array size_t == sizeof (block) == sizeof (u_char [16]) == 16
假设声明如
block someArray[10];
然后someArray
是u_char
的10x16数组。您可以通过
someArray
中的行数
sizeof someArray / sizeof *someArray
这将someArray
(160)中的总字节数除以someArray
(16)的单行中的字节数,为您提供行数(10)。
但是,如果你写
block *array = someArray;
然后您将无法使用someArray
变量确定array
中的行数。 sizeof array
返回指针的大小,而不是指向的东西,sizeof *array
返回u_char
的16个元素数组的大小,而不是someArray
的大小。
所以当你写了
block *array = (block*) somePointer; // what is the type of somePointer,
// and is the cast really necessary?
您将array
设置为指向block
的单个实例。您无法从指针本身确定block
中有多少somePointer
行。
您可以使用sentinel值(类似于字符串中的0终止符)以某种方式标记最后一行(例如,如果该行的所有元素都设置为0或255或其他某种模式):
#define TERMINATOR 255
...
bool lastRow( block *b )
{
bool result = true;
for ( size_t i = 0; i < sizeof *b; i++ )
result = result && (b[i] == TERMINATOR);
return result;
}
int main( void )
{
...
block *array = (block *) somePointer;
...
size_t count = 0;
while ( !lastRow( array++ ) )
count++;
...
}
当然,这仅在所有255(或0或其他值)的行不是有效数据时才有效。否则,您需要手动跟踪somePointer
的大小。
答案 1 :(得分:0)
指向array
的指针的大小。它指向数组的第一个元素:
sizeof(array) == 4;
这是array
指向的数组的大小,即第一个元素(长度为16的数组):
sizeof(*array) == 16;
n
必须是有限的。 C中没有无限数组。
n
的值必须在使用前定义。