【问题标题】:C- Iterating over an array of structs passed through a void*C-遍历通过 void* 传递的结构数组
【发布时间】:2017-01-17 04:59:23
【问题描述】:

我有一个功能

struct Analysis reduce (int n, void* results)

其中 n 是要分析的文件数,我将一个分析结构数组传递给结果。

Analysis 结构体定义如下:

struct Analysis {
  int ascii[128]; //frequency of ascii characters in the file
  int lineLength; //longest line in the file
  int lineNum; //line number of longest line
  char* filename;
}

我已经将 void * 转换成这样,

struct Analysis resArray[n];
struct Analysis* ptr = results;
resArray[0] = ptr[0];

但我不知道如何正确地遍历 resArray。我试过了

for (i = 0; i < n; i++){
  printf("lineLength: %d\n", resArray[i].lineLength);
}

n = 3,我得到垃圾值。 resArray[0] 是正确的,但是 resArray[1] 是一个非常高的数字,而 resArray[2] 只是 0。为什么 resArray[1] 或 resArray[2] 不能给出正确的值?如果我错误地增加了地址,那将是有意义的,但我只是在某个索引处访问数组。在这里迷路了!

【问题讨论】:

  • 试试ptr[i]而不是resArray[i]
  • 使用resArray[0] = ptr[0];,您将results 的第一个元素复制到resArray 的第一个元素中。其他值未初始化。
  • Why wouldn't resArray[1] or resArray[2] give the correct values - 因为没有对这些元素执行分配?你对resArray[0] = ptr[0]; 所做的只是拉出第一个元素。该数组中的其他所有内容都是 indeterminate 的。但是..为什么首先将它们塞入另一个数组中。只使用 ptr[i].linelength 有什么问题?
  • 你应该和Patrick聊天;他还询问通过void * 访问struct Analysis
  • 你为什么用void*

标签: c arrays struct iteration void-pointers


【解决方案1】:

您不能直接将指针分配给数组,因为它们是不同的类型since array[n] is type struct analysis(*)[n] and ptr is type struct analysis(*)。更多信息请查看here

【讨论】:

    【解决方案2】:

    resArray[0] 是正确的,因为有“东西”:

    resArray[0] = ptr[0];
    

    其他元素是垃圾,因为您没有在那里设置任何值。如果要复制整个数组,则需要将复制方法更改为:

    for (i = 0; i < n; i++)
    {
      resArray[i] = ptr[i];
    }
    

    【讨论】:

      【解决方案3】:

      希望这段代码对您有所帮助。

      #include <stdio.h>
      #define d 3
      struct Analysis {
          int ascii[128];
          int lineLength;
          int lineNum;
          char *filename;
      };
      
      struct Analysis Analyses[d];
      
      struct Analysis reduce(int n, void *results) {
      
          struct Analysis resArray[n];
          struct Analysis *ptr = results;
      
          for (int i = 0; i < n; i++) {
              resArray[i] = ptr[i];
          }
      
          for (int i = 0; i < n; i++) {
              printf("lineLength: %d\n", ptr[i].lineLength);
          }
      
          return *ptr;
      }
      
      int main(void) {
          struct Analysis a = {{5}, 2, 2, "George"};
          struct Analysis b = {{6}, 3, 3, "Peter"};
          struct Analysis c = {{7}, 4, 4, "Jane"};
          Analyses[0] = a;
          Analyses[1] = b;
          Analyses[2] = c;
          reduce(d, &Analyses);
          return 0;
      }
      

      你可以试试online

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2017-04-19
        • 1970-01-01
        • 2021-03-01
        • 2012-01-04
        • 2013-05-12
        相关资源
        最近更新 更多