以C为单位获取二维数组的长度
如果有人知道,我只需要一个明确的答案。以C为单位获取二维数组的长度,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,如果有人知道,我只需要一个明确的答案。 我已经检查了类似的问题,但没有一个能澄清多维数组中发生了什么。所以 typedef u_char block[16]; block *array = (block*) somePointer; 我试图将字节流读取为块数组。 同样,每个元素的大小正好是1字节,所以不要试图用大小和元素来混淆我。 我假设(希望)变量array已成为一个块数组 array[n][16]; 如何确定n的值??它是有限的吗 一些测试表明: sizeof(array) == 4;
我已经检查了类似的问题,但没有一个能澄清多维数组中发生了什么。所以
typedef u_char block[16];
block *array = (block*) somePointer;
我试图将字节流读取为块数组。同样,每个元素的大小正好是1字节,所以不要试图用大小和元素来混淆我。
我假设(希望)变量
array
已成为一个块数组
array[n][16];
如何确定
n
的值??它是有限的吗
一些测试表明:
sizeof(array) == 4; // n != sizeof (array)
sizeof(*array) == 16; // n != sizeof (*array)
这是指向
数组的指针的大小。它指向数组的第一个元素:
sizeof(array) == 4;
这是数组
指向的数组的大小,即第一个元素(长度为16的数组):
n
必须是有限的。C语言中没有无限数组。
使用前必须定义n
的值。TL/DR版本
您将无法使用数组
变量在单个表达式中计算n
。指向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
是一个10x16的u\u char
数组。您可以通过以下方式确定someArray
中的行数
sizeof someArray / sizeof *someArray
这将someArray
(160)中的总字节数除以someArray
(16)中单个行中的字节数,得到行数(10)
然而,如果你写
block *array = someArray;
然后,您将无法使用array
变量确定someArray
中的行数sizeof array
返回指针的大小,而不是指向的对象,sizeof*array
返回16个元素的u_char
数组的大小,而不是someArray
的大小
所以当你写信的时候
block *array = (block*) somePointer; // what is the type of somePointer,
// and is the cast really necessary?
将array
设置为指向block
的单个实例。您无法从指针本身确定somePointer
中有多少行block
可以使用sentinel值(类似于字符串中的0终止符)以某种方式标记最后一行(例如,如果该行的所有元素都设置为0或255或其他模式):
#定义终止符255
...
布尔拉斯特罗(b区)
{
布尔结果=真;
对于(大小i=0;i
当然,这仅在包含所有255(或0,或其他值)的行不是有效数据时才起作用。否则,您需要手动跟踪somePointer
的大小 sizeof(pointer)==4
(32位,您已打开)和sizeof(char[16])==16
…为什么我不感到惊讶?“我假设(希望)变量数组已成为块数组。”-如果指针是数组,它将不会被称为“pointer”,而是“array”!它甚至不指向二维阵列。请学习这些基础知识。关于如何声明2D数组,这里有足够多的问题(注意:它不像int**array;
-这是初学者的另一个错误概念!如果1)它不是必需的,或者2)你不理解所有含义,或者3)不完全接受它们,就永远不要使用它!“如何确定n
的值?”——n
我假设(希望)变量数组已经变成了块数组。
。。。数组不是指针,反之亦然。总的来说,你是对的,但我不认为这是问题的答案。:)如何确定n的值??它是有限的吗?你能在我的回答中找到这些问题的答案吗?我感谢你的努力somePointer
是u\u char*
。这指向通过网络捕获的字节流。我已经了解到,数据的长度取决于您要查找的内容(当然还有捕获长度)。
block *array = (block*) somePointer; // what is the type of somePointer,
// and is the cast really necessary?
#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++;
...
}