我试图将指针数组传递给函数,而无需定义大小。 此外,输出是一个警告"初始化使得指针来自整数而不是强制转换。 最感兴趣的是传递指针数组而不是数组,因为我尝试理解当数据是使用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
答案 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++;
}
}