我的C编程生锈了,我遇到了一些问题

时间:2015-06-22 15:58:26

标签: c pointers data-structures

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

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;

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

class ItemStocks(models.Model):
    _name = 'item.stocks'

    item_url = fields.Char('View Item')
ItemStocks()

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

我玩了一下代码似乎可能1&lt;&lt; 24太大了?将它降低到1 <&lt;&lt; 14,程序运行正常。

这让我想到另一个问题,为什么1&lt;&lt;&lt; 24或者大约1600万ints会导致我的程序崩溃?这是一个相当简单的程序,只是在主要样板和这个结构?

6 个答案:

答案 0 :(得分:1)

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

也许,你想写类似

的东西
 _points[i].x = get_rand_float();

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

如果get_rand_float()返回float ,并且您想要存储返回的值,那么您不需要使用指针作为您的结构成员变量。您只需使用float x;等等。

答案 1 :(得分:1)

你不想要一个浮点指针结构:

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

你想要一个浮动结构:

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

答案 2 :(得分:0)

编辑:根据您的编辑,当您在结构中使用大量结构大小(1 <&lt;&lt;&lt;&lt;&lt;&lt; 24)或16,777,216项时,会发生崩溃。从这里借一个答案:

Size limitation of C structure

通过在对象中拥有超过65535个字节,您可能会违反C标准。由于1 <&lt;&lt;&lt; 14工作,这只是16384,这可能是原因。要验证,请尝试使用大于1&lt;&lt; 16的任何内容 - 这些都应该崩溃,因为它将超过65535.

另一方面,如果您发布实际的错误消息,将会有所帮助,以便我们更好地了解正在发生的事情。 :)

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

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

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();
}

答案 3 :(得分:0)

保持数组的大小,你的程序主要崩溃,因为没有内存分配给指针变量x,y和z。 在分配任何值之前,必须为变量分配内存。

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/White" >

        <include
            android:id="@+id/header"
            layout="@layout/header_app" />



        <RelativeLayout
            android:id="@+id/rl_footer"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" >

            <include layout="@layout/footer" />
        </RelativeLayout>

    </RelativeLayout>

通过将float作为结构的成员而不是浮点指针,可以使程序变得简单。

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");
    }

答案 4 :(得分:0)

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

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

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

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

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

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

答案 5 :(得分:0)

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

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

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