Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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的适当的简单Decllation_C_Arrays_Loops_Struct_Iteration - Fatal编程技术网

在不知道元素数的情况下迭代准备好的结构数组c的适当的简单Decllation

在不知道元素数的情况下迭代准备好的结构数组c的适当的简单Decllation,c,arrays,loops,struct,iteration,C,Arrays,Loops,Struct,Iteration,我一直在研究有关如何迭代包含混合类型数据字段的结构数组的问题,结果得到了复杂的答案。我在找一些相当简单的东西 我的程序从linux IPtables中检索IP地址以及它们是否被接受的状态。程序的第一部分如下所示: iptstat* ips=malloc(100000); memset(ips,0,99999); // custom function is called here that properly fills up iptstat structure with data. iptstat

我一直在研究有关如何迭代包含混合类型数据字段的结构数组的问题,结果得到了复杂的答案。我在找一些相当简单的东西

我的程序从linux IPtables中检索IP地址以及它们是否被接受的状态。程序的第一部分如下所示:

iptstat* ips=malloc(100000);
memset(ips,0,99999);
// custom function is called here that properly fills up iptstat structure with data.
iptstat* p=ips;int sz=sizeof(iptstat);
第一个片段在运行测试后没有问题。现在第二个片段给我带来了困难,因为我无法看到数据的结果

当我尝试通过以下方式迭代结构时:

while(p != '\0'){
printf("IP %s stat %d\n",p->IP,p->stat);
p+=sz; 
}
我在屏幕上看到:

IP  stat 0
IP  stat 0
IP  stat 0
...
IP  stat 0
Segmentation fault
相反,我希望只有两个条目以以下形式显示:

IP xxx.xxx.xxx.xxx stat x 
其中xxx.xxx.xxx.xxx是实际IP地址,x为1或2

然后,我继续将代码中的问题片段更改为此,希望能够运行循环,直到看到空指针:

while(*p){
printf("IP %s stat %d\n",p->IP,p->stat);
p+=sz; 
}
编译器报告:

./test.c: In function 'main':
./test.c:78: error: used struct type value where scalar is required
第78行是我正在挣扎的while循环


这个问题有一个简单的答案吗,还是我要用一个涉及for循环的相当复杂的答案?

with
p+=sz
使用
sz*sizeof(iptstat))
增加p。你应该只写
p++iptstat
的大小


(另请参见Joachim的评论,
while(p!='\0')
应该是
while(p->IP)

x是1或2。
…嗯,为什么?你真的需要自己跟踪大小!另外,
p
是指向
ipstat
的指针,它不是字符,不要将任意指针与字符进行比较。以类似于现在的方式解决此问题的唯一方法是,最后添加一个特殊的sentinel结构,其中包含正常结构中无法包含的值,并进行检查。然后你可以检查
p->some_member!=一些非法值
x分别为接受和拒绝状态的1或2。我使用数字来节省内存空间。只有指针可以是
NULL
,如果要将指针与
NULL
进行比较,请将其与
NULL
进行比较,而不是与NULL字符进行比较(尽管它们的名称相似,但这是完全不同的)。顺便说一句,在循环(第一个版本)中,
p
可能永远不会为
NULL
,除非您要经过分配的内存,并且指针值溢出。