我正在编写一个与main分开的函数,它读入一个结构数组并打印每个数组元素的结构元素。然而,我的问题是循环使用此数组来打印每个元素的条件语句。 sizeof(a)/ sizeof(a [])只是在函数中不起作用,因为它在原型中等于零。有什么我想念的吗?我尝试过指针运算,它也不起作用。
void printNames( person a[]){
int i;
for(i = 0;i<sizeof(a)/sizeof(a[0]);i++)
printf("Name: %s | Age: %d\n", a[i].name, a[i].age);
}
int main(int argc, char *argv[]){
if (argc == 1 || argc%2 == 0){
printf("Invalid arguments.\n Usage: %s name1 age1 name2 age2 ...", argv[0]);
return 0;
}
printf("You have entered %d person(s) into the program.\n", argc/2);
person people[argc/2];
int i;
for (i = 0; i<argc/2;i++){
strcpy(people[i].name, argv[i*2+1]);
people[i].age = atoi(argv[i*2+2]);
if(people[i].age <= 0){
printf("Invalid age <= 0. Try again.");
return 0;
}
}
答案 0 :(得分:2)
a
成为一个指针,所以它只能通过这个指针来计算数组的大小,你必须通知函数它的大小:
void printNames(person *a, size_t num)
{
int i;
for (i = 0; i < num; i++)
printf("Name: %s | Age: %d\n", a[i].name, a[i].age);
}
然后从printNames
拨打main
,如下所示:
printNames(people, sizeof(people)/sizeof(*people));
答案 1 :(得分:1)
在C中,数组参数衰减成指针。因此,表达式sizeof(a)/sizeof(a[0])
变为sizeof(int *)/sizeof(int)
,结果为1(假设int
和int *
的大小为4),因此for
循环变为printNames()
无论数组的大小如何,{1}}只执行一次。
因此,sizeof
不应用于获取这些情况下的元素数量。相反,我们可以将数组大小的附加参数传递给printNames()
。
考虑以下C程序:
#include<stdio.h>
void func(int array[])
{
int i;
int arraySize = sizeof(array)/sizeof(array[0]); /* arraySize <-- 1<-- 4/4 */
for (i = 0; i < arraySize; i++)
{
array[i] = i;
}
}
int main()
{
int i;
int array[4] = {0, 0 ,0, 0};
func(array);
for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf(" %d " ,arr[i]);
getchar();
return 0;
}
Intel Architecture-32 计算机上的<0>输出:0 0 0 0。
所以纠正的程序是:
#include<stdio.h>
void func(int array[], size_t arraySize)
{
int i;
for (i = 0; i < arraySize; i++)
{
array[i] = i;
}
}
int main()
{
int i;
int array[4] = {0, 0 ,0, 0};
func(array, 4);
for(i = 0; i < sizeof(array)/sizeof(array[0]); i++)
printf(" %d ", array[i]);
getchar();
return 0;
}