我的C编程已经生锈,我';我有些问题

我的C编程已经生锈,我';我有些问题,c,pointers,data-structures,C,Pointers,Data Structures,我试图用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();

我试图用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;

const unsigned int sz=1在代码中,
sz
int
变量,而不是数组。因此,在技术上,您不能在
sz
上使用数组下标运算符该代码不应编译。

也许,你想写点什么

 _points[i].x = get_rand_float();
但同样,它取决于
get\u rand\u float()
返回类型。它必须返回一个
浮点*
(不太可能看到函数名)


在这种情况下,如果
get\u rand\u float()
返回一个
float
值,并且希望存储返回的值,则不需要使用指针作为结构成员变量。您只需使用
float x等等。

您不希望浮点数的指针结构:

struct point {
   float *x;
   float *y;
   float *z;
};
您需要浮点数的结构:

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

编辑:根据您的编辑,当您使用一个大的结构大小(1保持数组的大尺寸时,您的程序会发生崩溃,因为没有为指针变量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");
    }
for(int i=0;isz[i].x=get_rand_float();其他人已经指出了您的两个主要问题(大小太大,您应该在结构中使用float not float*)。但还有另一个潜在问题:您不应该养成在标识符名称开头加下划线的习惯,因为根据1999 C标准第7.1.3节:

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

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

  • 除非另有明确说明(见7.1.4),否则以下任何子条款(包括未来的库方向)中的每个宏名称都是保留的,以便在包含其任何相关标题时按规定使用

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

  • 以下任何子条款(包括未来的库说明)中列出的每个文件范围标识符都保留用作宏名称,并且如果包含其任何关联头,则保留用作相同名称空间中文件范围的标识符


一个可能的问题是,您的点数组对于堆栈来说太大。请参阅。您可以通过动态内存分配来解决此问题,如:

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

当然,完成后别忘了释放内存。

请编辑标题,真实反映您遇到的问题,并在帖子中如实说明问题。我们不知道什么是“我有点麻烦”意思是马上。你不能在没有编译的东西上崩溃…我有点麻烦不是一个有意义的问题描述。请你的问题清楚地解释你有什么麻烦。当你这样做的时候,你可以编辑你文章的标题来描述你的问题或问题你问的方式对在搜索结果中找到它的未来读者来说很有意义。谢谢。你正在使用哪些编译器选项来编译这个程序…(只是出于好奇,并不是说它有助于回答这个问题)我认为-除了所有显而易见的-问题是,在point结构中,您有float*-分配或删除*(使其成为变量而不是指针)OP当然不应该使用保留标识符,这是值得指出的,但这不太可能是问题的原因。谢谢你,我阅读了参考资料,它很清楚。我将确保今后不会使用这种类型的命名约定。这个答案非常有帮助,似乎我可以达到1I的高度恐怕我无法回答这个问题;还有其他人愿意插手吗?不幸的是,这并不完全是最熟悉的SoA编程。谢谢你,malloc,使用内部指针是解决我崩溃的好办法。
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");
    }
struct point *_points = malloc(sz*sizeof(struct point));