我被困住了。我创建了这段代码,希望一个函数可以存储数据,然后另一个函数可以将它全部打印回给我。问题是打印功能(也就是itr8功能)给了我一些值以及分段错误。
从这个例子中,我预计屏幕上会出现以下内容:
item->outptr=1.00000
item->special=0
item->outptr=2.00000
item->special=1
如果在outptr的值附加一个后跟任意数量的零的点,我现在不在乎。我尝试执行代码时的真实结果是:
item->outptr=2.000000
item->special=1
Segmentation fault
我认为我已经分配了足够的内存来存储数据,但在某些地方我认为指针搞砸了。在我的itr8函数中,我试图寻找NULL,以便程序在到达数据集后可以停止。毕竟,我通过calloc分配了内存,这使得分配内存的每个字节都以null开头。
我做错了什么?
#include <stdio.h>
#include <stdlib.h>
typedef struct{
double outptr;
int special;
}set;
void itr8(set** items){
while (items !='\0'){
printf("item->outptr=%lf\n",(*items)->outptr);
printf("item->special=%d\n",(*items)->special);
items++;
}
}
void ext(set** items,int shapeno){
switch(shapeno){
case 0:
(*items)->outptr=1;
(*items)->special=0;
break;
case 1:
(*items)->outptr=2;
(*items)->special=1;
break;
}
items++;
}
int main(){
const int numitems=100;
set* item=calloc(1,sizeof(set)*numitems); //allocate lots of space
set* ritem=item; //need backup pointer since item is modified in function
ext(&item,0);
ext(&item,1);
item=ritem; //restore pointer for iteration
itr8(&item);
free(ritem);
return 0;
}
答案 0 :(得分:2)
你有两个问题。
第一个是ext
函数,其中items++
未按照您的意图修改item
中的main()
。相反,它应该被解除引用一次:
void ext(set** items,int shapeno){
switch(shapeno){
case 0:
(*items)->outptr=1;
(*items)->special=0;
break;
case 1:
(*items)->outptr=2;
(*items)->special=1;
break;
}
++*items;
}
第二个是itr8
,目前无法正常工作。您不想修改items
,因此您只应传递set *
而不是set **
。还有一个问题是确定要循环的项目数量;您检查的检查不起作用,因为您正在与空字符进行比较,其次是因为您无法进行指针比较。一种方法是通过传递第二个set *
参数来告诉它何时停止迭代,该参数指示一个超过item
中最后一个元素的参数:
void itr8(set* item, set* stop){
while (item != stop){
printf("item->outptr=%lf\n", item->outptr);
printf("item->special=%d\n", item->special);
item++;
}
}
然后你应该把它称为:
int main(){
const int numitems=100;
set* item=calloc(numitems,sizeof(set)); //allocate lots of space
set* ritem=item; //need backup pointer since item is modified in function
ext(&item,0);
ext(&item,1);
itr8(ritem, item); // note change in how to call it
free(ritem);
return 0;
}
请注意,我也稍微更改了calloc
;第一个参数应该是元素的数量,第二个参数应该是每个元素的大小。
答案 1 :(得分:0)
while (items !='\0')
在itr8()
我们不好,因为items
在进入无效区域之前不会是NULL
。
items++;
中的itr8()
将items
点无效区域,因为item
,其中items
点在增量之前,是“一个元素的数组”。 试试这个:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
double outptr;
int special;
}set;
void itr8(set** items){
while ((*items)->outptr!=0.0 || (*items)->special!=0){
printf("item->outptr=%lf\n",(*items)->outptr);
printf("item->special=%d\n",(*items)->special);
(*items)++;
}
}
void ext(set** items,int shapeno){
switch(shapeno){
case 0:
(*items)->outptr=1;
(*items)->special=0;
break;
case 1:
(*items)->outptr=2;
(*items)->special=1;
break;
}
(*items)++;
}
int main(void){
const int numitems=100;
set* item=calloc(1,sizeof(set)*numitems); //allocate lots of space
set* ritem=item; //need backup pointer since item is modified in function
ext(&item,0);
ext(&item,1);
item=ritem; //restore pointer for iteration
itr8(&item);
free(ritem);
return 0;
}