【问题标题】:My C programming is rusty and i'm having some issues我的 C 编程生锈了,我遇到了一些问题
【发布时间】:2023-03-27 15:10:02
【问题描述】:

我正在尝试在 c 中声明一个数据结构并设置一些变量,但我遇到了一些麻烦。

struct point {
   float *x;
   float *y;
   float *z;
};

这个结构有 24 个字节长,所以我没问题。

const unsigned int sz = 1<<24;
struct point _points[sz];

for(int i = 0; i < sz; ++i)
{
    _points[i].x = get_rand_float(); 
    _points[i].y = get_rand_float();
    _points[i].z = get_rand_float();
}

// get_rand_float() returns a pointer to float;

我遇到的问题是应用程序会崩溃。

我玩了一下代码,似乎 1

这让我想到另一个问题,为什么 1

【问题讨论】:

  • 请编辑您的标题以实际反映您遇到的问题,并请在您的帖子中实际说明问题。我们不知道“我遇到了一些麻烦”是什么意思。
  • 你不能在无法编译的东西上崩溃......
  • 我有点麻烦 不是一个有意义的问题描述。请edit您的问题清楚地解释您遇到的麻烦。当您使用它时,您可以将帖子的标题编辑为也描述您遇到的问题或您提出的问题的方式,这种方式对在这里找到它的未来读者有意义搜索结果。谢谢。
  • 你正在使用哪些编译器选项来编译这个程序......(只是出于我的好奇,它不会帮助回答这个问题)
  • 我认为 - 除了所有明显的问题 - 问题是在点结构中你有 float* - 分配或删除 *(使其成为变量而不是指针)

标签: c pointers data-structures


【解决方案1】:

你不想要一个指向浮点数的结构:

struct point {
   float *x;
   float *y;
   float *z;
};

你想要一个浮动结构:

struct point {
   float x;
   float y;
   float z;
};

【讨论】:

    【解决方案2】:

    在您的代码中,szint 变量,而不是数组。因此,从技术上讲,您不能在 sz 上使用数组下标运算符。 该代码不应编译。

    也许,你想写类似的东西

     _points[i].x = get_rand_float();
    

    但话又说回来,这取决于get_rand_float() 返回类型。它必须返回一个float *(不太可能看到函数名)。

    如果get_rand_float()返回一个floatvalue,并且你想存储返回的值,那么你不需要使用指针作为你的结构成员变量。你可以简单地使用float x;等等。

    【讨论】:

      【解决方案3】:

      一个可能的问题是您的点数组对于堆栈来说太大了。见here。您可以通过动态内存分配来解决这个问题,例如:

      struct point *_points = malloc(sz*sizeof(struct point));
      

      当然,完成后不要忘记释放内存。

      【讨论】:

      • 谢谢你,malloc 和使用内部指针是我崩溃的一个很好的解决方案。
      【解决方案4】:

      编辑:根据您的编辑,当您使用大量结构大小 (1

      Size limitation of C structure

      您的对象中有超过 65535 个字节似乎违反了 C 标准。由于 1

      附带说明,如果您发布您收到的实际错误消息会很有帮助,以便我们更好地了解正在发生的事情。 :)

      ---作者前编辑答案---

      假设 get_rand_float() 返回它应该返回的结果,问题是 sz 是一个 int,而不是一个结构。它应该看起来像:

      int sz = 24;
      struct point _points[sz];
      
      for(int i = 0; i < sz; ++i)
      {
          _points[i].x = get_rand_float(); 
          _points[i].y = get_rand_float();
          _points[i].z = get_rand_float();
      }
      

      【讨论】:

      • 这个答案非常有帮助,似乎我可以在 1size of 1<<19 is: 524288i max size: 18446744073709551615
      • 恐怕无法回答;还有其他人愿意加入吗?不幸的是,并不是最熟悉 SoA 编程的人。
      【解决方案5】:

      其他人指出了您的两个主要问题(尺寸太大,您应该在结构中使用 float 而不是 float*)。但是还有另一个潜在的问题:您不应该养成以下划线开头的标识符名称的习惯,因为从 1999 C 标准的第 7.1.3 节开始:

      • 以下划线和大写字母或另一个下划线开头的所有标识符始终保留供任何使用。

      • 以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。

      • 以下任何子条款(包括未来的库方向)中的每个宏名称都保留用于指定使用,如果包含任何相关的头文件;除非另有明确说明(见 7.1.4)。

      • 以下任何子条款(包括未来的库方向)中具有外部链接的所有标识符始终保留用作具有外部链接的标识符。154

      • 在以下任何子条款(包括未来的库方向)中列出的每个具有文件范围的标识符都保留用作宏名称和作为具有相同名称空间中的文件范围的标识符(如果有任何关联)包含标题。

      【讨论】:

      • OP 当然不应该使用保留标识符,这是值得指出的,但这不太可能是问题的原因。
      • 谢谢,我阅读了参考资料,很清楚。我会确保以后不再使用这种类型的命名约定。
      【解决方案6】:

      除了数组的大尺寸之外,您的程序主要是因为没有为指针变量 x、y 和 z 分配内存而崩溃。 在分配任何值之前,您必须为变量分配内存。

      for(int i = 0; i < sz; ++i)
      {
          sz[i].x = get_rand_float(); <--- getting crash here!
          sz[i].y = get_rand_float();
          sz[i].z = get_rand_float();
      }
      
      for(i=0;i<sz;i++)
          {
              _points[i].x =(float *) malloc(sizeof(float));
              _points[i].y = (float *) malloc(sizeof(float));
              _points[i].z = (float *) malloc(sizeof(float));
             *( _points[i].x) = get_rand_float();
             *( _points[i].y) = get_rand_float();
             *( _points[i].z) = get_rand_float();
          }
          for(i=0;i<sz;i++)
          {
              printf("%f %f %f ",*( _points[i].x), *(_points[i].y), *(_points[i].z));
              printf("\n");
          }
      

      您可以通过将浮点数作为结构的成员而不是浮点指针来简化程序。

      struct point {
         float x;
         float y;
         float z;
      };
      int main()
      {
          int i;
          for(i=0;i<sz;i++)
          {
              _points[i].x = get_rand_float();
              _points[i].y = get_rand_float();
              _points[i].z = get_rand_float();
          }
          for(i=0;i<sz;i++)
          {
              printf("%f %f %f ", _points[i].x, _points[i].y, _points[i].z);
              printf("\n");
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        相关资源
        最近更新 更多