我已经获得了c api和最低限度的文档。 开发人员目前不在,他的代码返回意外值(数组不是预期长度)
我遇到了返回指向数组指针的方法的问题,并且想知道我是否正确迭代它们。
问:以下是否始终返回正确的数组len?
int len=sizeof(sampleState)/sizeof(short);
int len=sizeof(samplePosition)/sizeof(int);
typedef unsigned char byte;
int len=sizeof(volume)/sizeof(byte);
我使用指针和指针算法迭代数组(我正确地为下面的所有类型做了)
下面的最后一个例子是多维数组?什么是迭代这个的最好方法?
感谢
//property sampleState returns short[] as short*
short* sampleState = mixerState->sampleState;
if(sampleState != NULL){
int len=sizeof(sampleState)/sizeof(short);
printf("length of short* sampleState=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" sampleState[%d]=%u\n",j, *(sampleState+j));
}
}else{
printf(" sampleState is NULL\n");
}
//same with int[] returned as int*
int* samplePosition = mixerState->samplePosition;
if(samplePosition != NULL){
int len=sizeof(samplePosition)/sizeof(int);
printf("length of int* samplePosition=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" samplePosition[%d]=%d\n",j, *(samplePosition+j));
}
}else{
printf(" samplePosition is NULL\n");
}
这里的字节是def到
的类型typedef unsigned char byte;
所以我使用%u
//--------------
byte* volume = mixerState->volume;
if(volume != NULL){
int len=sizeof(volume)/sizeof(byte);
printf("length of [byte* volume = mixerState->volume]=%d\n", len);//OK
for(int j=0;j<len;j++) {
printf(" volume[%d]=%u\n",j, *(volume+j));
}
}else{
printf(" volume is NULL\n");
}
以下是int[][] soundFXStatus
。
我只使用上面的相同方法并有2个循环吗?
//--------------
int** soundFXStatus = mixerState->soundFXStatus;
答案 0 :(得分:10)
只有拥有实际数组而不是指针时,sizeof(array)/sizeof(element)
技巧才有效。如果只有一个指针,那么无法知道数组的大小;你必须将数组长度传递给函数。
或者更好地使用具有vector
功能的size
。
答案 1 :(得分:4)
sizeof(sampleState)/sizeof(short);
如果将sampleState
声明为数组而不是指针,仅给出数组的长度:
short array[42];
sizeof(array)/sizeof(short); // GOOD: gives the size of the array
sizeof(array)/sizeof(array[0]); // BETTER: still correct if the type changes
short * pointer = whatever();
sizeof(pointer)/sizeof(short); // BAD: gives a useless value
另外,请注意函数参数实际上是指针,即使它看起来像数组:
void f(short pointer[]) // equivalent to "short * pointer"
{
sizeof(pointer)/sizeof(short); // BAD: gives a useless value
}
在您的代码中,sampleState
是一个指针;只给出指向它的指针,就无法确定数组的长度。据推测,API提供了一些获取长度的方法(因为否则它将无法使用),您将需要使用它。
在C ++中,这就是为什么你更喜欢std::vector
或std::array
到手动分配的数组的原因之一;虽然这对你没有帮助,但是尽管有问题标签,你在这里使用C.
答案 2 :(得分:1)
int len=sizeof(sampleState)/sizeof(short);
int len=sizeof(samplePosition)/sizeof(int);
sizeof在编译时完成,因此如果在编译时未知数组的长度(例如,使用malloc保留内存),则此方法不起作用。
答案 3 :(得分:0)
ok忽略我上面使用的方法它完全错了 - 尽管你确实需要知道我最终从API开发者那里得到的数组的长度。