通过指向该数组的指针访问时如何知道数组元素的数量

时间:2015-05-28 15:13:47

标签: 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'},
{5,'e'},
{1,'a'}
};
dat* x=new;
printa(x);
return 0;
}

我正在尝试通过预先填充的结构显示值,以便稍后我可以对它们进行排序。

包含while(*x != NULL)的行对编译器有问题。它声明error: invalid operands to binary !=。然后我将其更改为while(*x),认为我搞砸了指针声明,编译器抱怨error: used struct type value where scalar is required。然后我继续将该行更改为while(x)。编译器没有抱怨,执行代码产生随机值以及分段错误。

然后我继续通过gdb运行有错误的编译代码并声明

  

编程接收信号SIGSEGV,分段故障。   在printa()中的0x0804838f

我可以通过修改我的代码来轻松修复我的问题,以匹配以下内容:

void printa(dat* x){
int num=0;
while(num++ < 2){
printf("%c %d\n",x->l,x->n);
x++;
}
}

但我宁愿让结构数组完全通过(打印所有元素)而不是停在固定数字上。

2 个答案:

答案 0 :(得分:2)

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

您必须遵循以下任一方法

  1. 将数组的长度作为第二个参数传递给函数。
  2. 在数组中使用sentinel value并检查函数中的值以停止访问。

答案 1 :(得分:0)

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

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

  1. 使用while (x->n != 0)

  2. 在数据初始化程序的末尾添加{0, 0}

  3. 如果零是您数据中的有效值,那么您当然需要对其进行调整。