处理指针和结构

时间:2015-04-15 19:34:41

标签: c pointers data-structures

我遇到了一个很大的问题,我尝试用很多不同的方法解决这个问题,却找不到解决方法。

我必须做的是:

  1. 创建一个介绍2套
  2. 的功能
  3. 显示这些集的另一个功能
  4. 需要使用一个结构,组件将是:

    1. 各个集合的元素数量;
    2. 指针(用于存储这两组元素);

      我不知道为什么,但是当我执行程序(如下所示)时,第一组的第二个元素没有显示。如果你有时间,请帮助我找到问题所在。当一切看起来都很好的时候真的很令人沮丧,而且程序仍然没有用。非常感谢你 !!!

    3. 标题 中,我有:

      #ifndef L8_3H_H_
      #define L8_3H_H_
      
      struct Set
      {
          unsigned int card;
          double *p[2];
      };
      
      typedef struct Set MULTIME;
      
      MULTIME *introduce_data();
      void showSet(MULTIME *m, int j);
      
      #endif /* L8_3H_H_ */
      

      main 中,我有:

          #include "L8_3h.h"
          #include <stdio.h>
      
      int main( void )
      {
          MULTIME *mult;
      
      
          mult = introduce_data();
      
          showSet(mult, 0);
          showSet(mult, 1);
      
      return 0;
      }
      

      我的 功能 是:

      #include "L8_3h.h"
      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>
      
      void showSet(MULTIME *m, int j)
      {
          int i;
      
      
      
          if ( j == 0 )
          {
              printf("\nA = {");
          }else
          {
              printf("\nB = {");
          }
      
          for (i = 0; i < (m + j)->card; ++i)
          {
              printf("%lf", *((m + j)->p[j]+i));
      
              if (i != (m + j)->card - 1)
              {
                  printf(", ");
              }
          }
      
          printf("}");
      }
      
      
      MULTIME *introduce_data()
      {
          MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));
          int i, j;
      
      
          for (i = 0; i < 2; ++i)
          {
      
      
              printf("\nIntroduce the number of elements of set %d", i + 1);
              scanf("%u", &(mult + i)->card);
      
      
             (mult+i)->p[i] = (double*)malloc(sizeof(double)*((mult+i)->card));
      
      
              printf("\nIntroduce the element of set %d\n", i+1);
              for (j = 0; j < (mult + i)->card; ++j)
              {
                  scanf("%lf", ((mult + i)->p[i]+j));
       //It's interesting that when I put a printf right after  introducing the 
      //element everything is fine(I get the right element)
              }
      
      
           }
      
      
          printf("\nHeres the problem");
          printf("\nThis should not be zero: %lf", *((mult + 0)->p[0]+1));
      
      return mult;
      }
      

3 个答案:

答案 0 :(得分:1)

这似乎不对

struct Set
{
    unsigned int card;
    double *p[2];
};

你有一套有2个号码列表。我认为每个集合应该有一个列表

struct Set
{
    unsigned int card;
    double *p;
};
那里的事情变坏了。您需要创建2个Set实例并将数据加载到每个实例中。我将创建一个Load_Set函数,它接受一个双列表并返回一个新的malloced Set

答案 1 :(得分:1)

我可以快速查看introduce_data()内的许多问题。

首先,转换malloc()的返回值,如

MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));

是不必要的。移除(MULTIME *)转换,并确保代码顶部有#include <stdlib.h>。退出#include <stdlib.h>并使用转换会导致代码具有未定义的行为。 (唯一的例外是如果你的C编译器实际上是一个C ++编译器 - 在这种情况下你需要#include <stdlib.h>和转换。否则不要使用转换。)。

其次,malloc()mult的内存分配为单个MULTIME。然后循环使用mult,就像它是两个MULTIME的数组一样。这落后于(动态分配的数组)的末尾。行为未定义。

第三,您将获得数组语法和指针语法之间的映射错误。声明

(mult+i)->p[i] = (double*)malloc(sizeof(double)*((mult+i)->card));

功能相同(删除类型转换)到

mult[i].p[i] = malloc(sizeof(double)*(mult[i].card));

同样,声明

scanf("%lf", ((mult + i)->p[i]+j));

相当于

scanf("%lf", mult[i].p[i]+j);

这两个可能都不是你想要的。

潜在的问题是你没有正确理解指针如何与数组一起工作。你需要更仔细地阅读你的教科书。

答案 2 :(得分:0)

我希望对遇到同样问题的其他人有用。

最后,感谢彼得,我明白了问题所在。 Peter注意到我使用变量 mult 作为两个 MULTIME 元素的数组,而它被声明为单元素变量。

所以,改变之后:

MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME));

到此:

MULTIME *mult = (MULTIME*)malloc(sizeof(MULTIME)*2);

我终于得到了正确的结果。