一个正确填充结构

时间:2015-11-18 01:02:52

标签: c loops pointers struct

我被困住了。我创建了这段代码,希望一个函数可以存储数据,然后另一个函数可以将它全部打印回给我。问题是打印功能(也就是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;
}

2 个答案:

答案 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)

    {li> while (items !='\0')itr8()我们不好,因为items在进入无效区域之前不会是NULLitems++;中的
  • 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;
}