2017-01-06 3 views
0

GArraysをソートするための練習プログラムです。私はsizeof()を使って配列のサイズを知っています。通常の配列とgarrayでsizeof()を使用する

論理的に考えると、sizeof(x)は24、つまり6整数である必要があります*各整数のサイズは4 - 6 * 4です。

しかし、私は私のガライにこれらの整数を入れたときに、サイズが8

ですなぜそれが8、なぜ32のですか? .. g_array_newは2の累乗でバイトを割り当てます? 2 24近くの最寄りの電力は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); 
} 
+4

'sizeof(arr)'は 'arr'の要素の数ではなく、ポインタの大きさを評価する。 –

+0

...上記の配列はポインタではありません。 – haccks

+0

まっすぐではありませんが(http://stackoverflow.com/questions/33836247/how-can-i-find-the-length-of-given-garray)、確かに関連しています。 – George

答えて

0

としてはarrは(アレイもないCF GArray reference)はGArrayへのポインタである、配列ではなく、解説の中で述べています。

xは配列なので、サイズはsize of an item * number of itemsなので、6 * sizeof(int)です。
arrポインタで、ポインタのサイズは、使用しているコンパイラおよびシステムに依存して、あなたのケースでは、int *は8

1

の大きさを持っているはい、私は答えを得た:

ガライが有する構造 です2つの要素gcharタイプの1とgunitタイプの他の

gcharは gunit次いで延びる1 + 4 = 5であろう4バイト

そうはsizeof(ガライ)またはここではsizeof(ARR)である1バイトでありますそれを最も近いものに2のべき乗、すなわち2^3は8である。

+1

'GArray'は' gchar * 'と' guint'を含み、 'gchar'と' guint'ではありません。 'guint'のサイズとアライメントは、最も一般的なプラットフォームでは4になる可能性がありますが、' gchar * 'のサイズとアラインメントは、プラットフォームに応じて4または8のいずれかになる可能性があります。また、 'arr'は' GArray'ではなく 'GArray * '型であるため、プラットフォームによってはそのサイズが4または8になる可能性があります。 –

+0

ああそうですか?洞察をありがとう... :) –

関連する問題