如何传递一个指针数组,并让函数找到数组的大小?

时间:2014-08-26 11:40:17

标签: c pointers

我试图将指针数组传递给函数,而无需定义大小。 此外,输出是一个警告"初始化使得指针来自整数而不是强制转换。 最感兴趣的是传递指针数组而不是数组,因为我尝试理解当数据是使用malloc动态分配的内存时如何处理实例

为什么会发生这种情况,如何将指针数组作为参数传递,而无需定义其大小?

Code:

#include <stdio.h>

void printData(int *data[]);


void main (int argc,char *argv[]){

    int *Data[] = {4, 8, 15, 16, 23, 42};
    printData(Data);

}

void printData(int *data[]){

    int **cur_data = data;
    int counter = sizeof(data)/sizeof(int);
    for(int i = 0; i<counter; i++){
        printf("%d. %d\n", i, *cur_data);
        cur_data++;
    }
}

Warning:

main.c: In function ‘main’:
main.c:9: warning: initialization makes pointer from integer without a cast
main.c:9: warning: initialization makes pointer from integer without a cast
main.c:9: warning: initialization makes pointer from integer without a cast
main.c:9: warning: initialization makes pointer from integer without a cast
main.c:9: warning: initialization makes pointer from integer without a cast
main.c:9: warning: initialization makes pointer from integer without a cast
gcc   main.o -o run

Run: 
0. 4

4 个答案:

答案 0 :(得分:3)

你不能,一个数组在传递给函数时衰减成指针,将counter作为参数传递给printData

#include <stdio.h>

void printData(int *data, int counter);

int main(void)
{
    int Data[] = {4, 8, 15, 16, 23, 42};
    int counter = sizeof(Data) / sizeof(int);

    printData(Data, counter);
    return 0;
}

void printData(int *data, int counter)
{
    for (int i = 0; i < counter; i++){
        printf("%d. %d\n", i, data[i]);
    }
}

或者您可以将计数器存储到数组的第一个元素中:

#include <stdio.h>

void printData(int *data);

int main(void)
{
    int Data[] = {0, 4, 8, 15, 16, 23, 42};

    Data[0] = sizeof(Data) / sizeof(int) - 1;
    printData(Data + 1);
    return 0;
}

void printData(int *data)
{
    int counter = data[-1];

    for (int i = 0; i < counter; i++){
        printf("%d. %d\n", i, data[i]);
    }
}

答案 1 :(得分:1)

这是更正的程序,当你将一个数组传递给一个函数时,它变成一个指针并丢失它的大小信息,所以需要单独传递

#include <stdio.h>

void printData(int *data, int size);


int main (int argc,char *argv[]){

    int Data[] = {4, 8, 15, 16, 23, 42};
    printData(Data, sizeof(Data));
    return 0;
}

void printData(int *data, int size){
    int *cur_data = data;
    int counter = size/sizeof(int);
    for(int i = 0; i<counter; i++){
        printf("%d. %d\n", i, *cur_data);
        cur_data++;
    }
}

,输出为:

0. 4
1. 8
2. 15
3. 16
4. 23
5. 42

答案 2 :(得分:1)

您将数组数据声明为指针数组,但使用整数常量而不是地址初始化它。

int *Data[] = {4, 8, 15, 16, 23, 42};

因此编译器会发出诊断消息。

您可以通过以下方式执行任务,即使用在这种情况下等于NULL的sentinal值。

#include <stdio.h>
#include <stdlib.h>

void printData( int *data[] );


int main(void) 
{
    int Values[] = { 4, 8, 15, 16, 23, 42 };
    const size_t N = sizeof( Values ) / sizeof( *Values );
    int *Data[N+1];
    size_t i;

    i = 0;
    for ( ; i < N; i++ )
    {
        Data[i] = malloc( sizeof( int ) );
        *Data[i] = Values[i];
    }
    Data[i] = NULL;

    printData( Data );

    for ( i = 0; i < N + 1; i++ ) free( Data[i] );

    return 0;
}

void printData( int *data[] )
{
    int **p = data;
    size_t i = 0;

    for( ; *p != NULL; ++p, ++i )
    {
        printf("%d. %d\n", i, **p );
    }
}

输出

0. 4
1. 8
2. 15
3. 16
4. 23
5. 42

考虑到函数main应具有返回类型int

答案 3 :(得分:0)

其中 -

int *Data[];

其中data是指向整数的指针数组。该数组指针可以指向1D数组或整数。但是你正在填充整数数据。对于1D阵列使用

int Data[]={4, 8, 15, 16, 23, 42};

并且无法使用指针知道数组的大小!唯一的方法是将元素的no传递给带有数组地址的函数!

尝试这些更改 -

#include <stdio.h>

void printData(int *data,int element);


void main (int argc,char *argv[]){

    int Data[] = {4, 8, 15, 16, 23, 42};
    printData(Data,6);

}

void printData(int *data, int element){

    int *cur_data = data;
    int counter = (sizeof(data)*element)/sizeof(int);
    for(int i = 0; i<counter; i++){
        printf("%d. %d\n", i, *cur_data);
        cur_data++;
    }
}