如何使用指针和长度未知来迭代数组?

时间:2012-04-02 15:57:38

标签: c++ c arrays pointers multidimensional-array

我已经获得了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;

4 个答案:

答案 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::vectorstd::array到手动分配的数组的原因之一;虽然这对你没有帮助,但是尽管有问题标签,你在这里使用C.

答案 2 :(得分:1)

int len=sizeof(sampleState)/sizeof(short);
int len=sizeof(samplePosition)/sizeof(int);

sizeof在编译时完成,因此如果在编译时未知数组的长度(例如,使用malloc保留内存),则此方法不起作用。

答案 3 :(得分:0)

ok忽略我上面使用的方法它完全错了 - 尽管你确实需要知道我最终从API开发者那里得到的数组的长度。