Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对普通数组和garrays使用sizeof()_C_Sizeof_Glib - Fatal编程技术网

C 对普通数组和garrays使用sizeof()

C 对普通数组和garrays使用sizeof(),c,sizeof,glib,C,Sizeof,Glib,这是一个对GArrays进行排序的实践程序,我使用了sizeof()来了解数组的大小 从逻辑上考虑,sizeof(x)应该是24,即6个整数*每个整数的大小,即4-6*4 但是当我把这些整数放到我的GArray中时,大小是8 为什么是8,为什么不是32。。当g_数组_new以2的幂分配字节时?24附近2的最近幂为2^5,即32 /************************************************************************************

这是一个对GArrays进行排序的实践程序,我使用了sizeof()来了解数组的大小

从逻辑上考虑,sizeof(x)应该是24,即6个整数*每个整数的大小,即4-6*4

但是当我把这些整数放到我的GArray中时,大小是8

为什么是8,为什么不是32。。当g_数组_new以2的幂分配字节时?24附近2的最近幂为2^5,即32

/*************************************************************************************************************
*   FILE NAME   :   ex-garray-6.c
*
*   DESCRIPTION :   sort Garray using GCompareFunc (Not used in GIMP, Gaim or Evolution)
*
************************************************************************************************************/

#include<glib.h>
#include<stdio.h>

/*************************************************************************************************************
*   FUNCTION NAME   :       print_arr
*   
*   DESCRIPTION     :       prints entire array using len and g_array_index
*
*   RETURNS         :       void
*
************************************************************************************************************/

void print_arr(GArray* arr)
{
        int i = 0;
        printf("\n Array : \n");
        for (i = 0; i < (arr->len); i++)
        {
                printf("%d\n", g_array_index(arr, int, i));
        }

}

/*************************************************************************************************************
*   FUNCTION NAME   :       compare_ints
*   
*   DESCRIPTION     :       utilized qsort() to sort elements of the unsorted array.
*                           arguments are two gpointers.They are typecasted to int pointers
*                           int the function 
*
*   RETURNS         :       int -  -ve if first arg is smaller than second arg
*                                   0 if first arg is equal to second arg
*                                  +ve - second arg is smaller than first arg
*
************************************************************************************************************/

int compare_ints( gpointer* a, gpointer* b)
{
        int* x = (int*)a;
        int* y = (int*)b;

        return (*x - *y);

}

/*************************************************************************************************************
*   FUNCTION NAME   :       main.c
*   
*   DESCRIPTION     :       main.c declares GArray,allocates memory to it, appends 6 integers into the array,*                           uses g_array_sort to print the array, uses print_arr function to print the array *                           frees array at end.
*
*   RETURNS         :       SUCCESS
*
************************************************************************************************************/

int main(int argc, char** argv)
{

        // 1. declare GArray pointer variable and allocate memory to it
        GArray* arr = g_array_new(FALSE, FALSE, sizeof(int));
        // g_array_set_size(arr,8); - didn't work to fix size to 8 bytes

        // 2. initialize int array of 6 elements say x
        int x[6] = {500,400, 500, 700, 200, 300};

        // 3. append in the array
        arr = g_array_insert_vals(arr,0, x, 6);
        printf("\n size of x : %d \n size of arr : %d", sizeof(x), sizeof(arr));

        // 4. print the array
        print_arr(arr);

        /* 5. sort the array using 
           g_array_sort( 
           <GArray pointer variable>,
           (GCompareFunc)<name of the compare function>);
           - compare function uses qsort()-
           -returns -ve a<b
           -returns 0 a = b
           -returns +ve b = a
           */
        /* 5.5 alternate sorting function -
            g_array_sort_with_data(
            <same as g_array_sort>,
            <same as g_array_sort>,
            <gpointer to user-data>); */

        printf("\n Array after sorting \n ");
        g_array_sort(arr, (GCompareFunc)compare_ints);

        // 6. print garray
        print_arr(arr);

        // 7. free garray 
        g_array_free(arr, TRUE);
}
/*************************************************************************************************************
*文件名:ex-garray-6.c
*
*描述:使用GCompareFunc对Garray进行排序(不用于GIMP、Gaim或Evolution)
*
************************************************************************************************************/
#包括
#包括
/*************************************************************************************************************
*功能名称:print\u arr
*   
*描述:使用len和g_数组索引打印整个数组
*
*退货:作废
*
************************************************************************************************************/
无效打印(GArray*arr)
{
int i=0;
printf(“\n数组:\n”);
对于(i=0;i<(arr->len);i++)
{
printf(“%d\n”,g_数组_索引(arr,int,i));
}
}
/*************************************************************************************************************
*函数名称:compare_ints
*   
*描述:利用qsort()对未排序数组的元素进行排序。
*参数是两个gpointer。它们被类型化为int指针
*整型函数
*
*如果第一个参数小于第二个参数,则返回:int--ve
*如果第一个参数等于第二个参数,则为0
*+ve-第二个参数小于第一个参数
*
************************************************************************************************************/
整数比较整数(gpointer*a,gpointer*b)
{
int*x=(int*)a;
int*y=(int*)b;
返回(*x-*y);
}
/*************************************************************************************************************
*函数名:main.c
*   
*DESCRIPTION:main.c声明GArray,为其分配内存,在数组中追加6个整数,*使用g_array_sort打印数组,使用print_arr函数打印数组*最后释放数组。
*
*回报:成功
*
************************************************************************************************************/
int main(int argc,字符**argv)
{
//1.声明GArray指针变量并为其分配内存
GArray*arr=g_数组_new(FALSE,FALSE,sizeof(int));
//g_array_set_size(arr,8);-无法将大小固定为8字节
//2.初始化6个元素的int数组,比如x
intx[6]={500400500700200300};
//3.在数组中追加
arr=g_数组插入值(arr,0,x,6);
printf(“\n x的大小:%d\n arr的大小:%d”,sizeof(x),sizeof(arr));
//4.打印阵列
打印arr(arr);
/*5.使用
g_数组_排序(
,
(GCompareFunc));
-比较函数使用qsort()-

-返回-ve a如注释中所述,
arr
不是数组,它是指向
GArray
的指针(它也不是数组,cf)

x
是一个数组,所以它的大小是
一个项目的大小*项目的数量
,所以
6*sizeof(int)

arr
是一个指针,指针大小取决于所使用的编译器和系统,在您的例子中,
int*
的大小为8。

是的,我得到了答案:

加里是一座建筑物 有两个元素,一个是gchar类型,另一个是gunit类型

gchar的大小为1字节 gunit有4个字节


所以这里的sizeof(GArray)或sizeof(arr)是1+4=5,然后将其扩展到2的最近幂,即2^3是8:)

sizeof(arr)
的计算结果是指针的大小,而不是
arr
中的元素数……所述数组不是指针。不是直接的,但绝对相关。
GArray
的可能副本包含一个
gchar*
和一个
guint
,而不是
gchar
和一个
guint
。数组的大小和对齐在大多数常见的平台上,
guint
很可能是4,但是
gchar*
的大小和对齐可能是4或8,这取决于平台。此外,您的
arr
类型是
GArray*
,而不是
GArray
,因此它的大小可能是4或8,这取决于平台。哦……是这样吗?谢谢或者是洞察力…:)