Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在通过指向数组的指针进行访问时知道数组的元素数_C_Arrays_Loops_Pointers_Struct - Fatal编程技术网

C 如何在通过指向数组的指针进行访问时知道数组的元素数

C 如何在通过指向数组的指针进行访问时知道数组的元素数,c,arrays,loops,pointers,struct,C,Arrays,Loops,Pointers,Struct,这是我的代码: #include <stdio.h> typedef struct{ int n; char l; } dat; void printa(dat* x){ while(*x != NULL){ printf("%c %d\n",x->l,x->n); x++; } } int main(int argc,char* argv[]){ dat new[10]={ {4,'d'}, {7,'g'}, {3,'c'}, {6,'f'}, {2,'b'},

这是我的代码:

#include <stdio.h>

typedef struct{
int n;
char l;
} dat;

void printa(dat* x){
while(*x != NULL){
printf("%c %d\n",x->l,x->n);
x++;
}
}

int main(int argc,char* argv[]){
dat new[10]={
{4,'d'},
{7,'g'},
{3,'c'},
{6,'f'},
{2,'b'},
{5,'e'},
{1,'a'}
};
dat* x=new;
printa(x);
return 0;
}

但是我宁愿让struct数组完全执行(打印所有元素),而不是在固定的数目上停止。

不,您想要的东西无法直接实现。使用指针指向数组后,指针不会继承数组大小附近的任何信息。因此,不能将指针传递给函数,而期望通过该指针计算数组的有效长度

您必须遵循以下任一方法

  • 将数组的长度作为第二个参数传递给函数
  • 在数组中使用,并检查函数中的值以停止访问

  • 如果指针以有效地址开头,然后递增,则指针永远不会为空

    您需要修改数据,以便循环知道何时停止

  • 当(x->n!=0)时使用

  • 在数据初始值设定项的末尾添加
    {0,0}


  • 如果零是数据中的一个有效值,那么您当然需要调整它。

    您还需要添加
    {0,0}
    ,否则您只是依赖于表末尾的内存为零。这并非不可能,但也无法保证。瞧,你在依赖“未定义的行为”。
    void printa(dat* x){
    int num=0;
    while(num++ < 2){
    printf("%c %d\n",x->l,x->n);
    x++;
    }
    }