こんにちは。
Cでメモリを動的確保できる配列を作るため、あるサイトを参考にシンプルなコードを書きました。
しかし、いくつもの不明箇所があり、"何をしていてなぜそうなるのか"理屈が掴めていません。
この理屈を理解したいので是非教えて欲しいのですが、主に以下の点で不明です。
全体を通しての処理
- (初期化)配列に入れたい型、個数、予約数、メモリを構造体に保持しておく。
- (配列へ追加)先に配列全体で必要となるメモリ領域を確保?それからmemcpyで追加データをメモリの空位置へコピーしている?
- (読み込み)読み込みたい要素のアドレスを返している...のか???
疑問点
- _group_offset関数は予めメモリ領域を確保するためのコードなのか?しかしこの関数で値を読み取れていること自体のセオリーが不明。
- _group_assign関数内でmemcpyによってコピーされるのはアドレスなのか?しかしmemcpyはoffsetの先頭文字列から順に転写していくはずなので追加順が逆転するのでは?
C
1#include <stdlib.h> 2#include <string.h> 3#include <stdio.h> 4 5 6typedef struct Group { 7 size_t size; 8 size_t capacity; 9 size_t element_size; 10 void* data; 11}Group; 12 13 14static void* _group_offset(Group* group, size_t index) 15{ 16 /* 不明箇所その一(何をしてるのかわからない) */ 17 /* 40バイトブロック + (インデックス * 4バイト) ...を返すだけ?*/ 18 return group->data + (index * group->element_size); 19} 20 21static void _group_assign(Group* group, size_t index, void* element) 22{ 23 /* 不明箇所その二(コピーしたoffsetは放置。しかしその後値へのアクセスはできている???) */ 24 /* 40バイトブロック返却で凡用ポインタ */ 25 void* offset = _group_offset(group, index); 26 /* offsetにelementをgroup->element_size分コピー */ 27 memcpy(offset, element, group->element_size); 28} 29 30int main() 31{ 32 Group group; 33 34 group.size = 0; 35 group.capacity = 10; 36 /* 4バイト */ 37 group.element_size = sizeof(int); 38 /* 40バイトのブロックを割当(予約保持数 * int型のバイトサイズ) */ 39 group.data = malloc(group.capacity * group.element_size); 40 41 int a=8; 42 int b=9; 43 int c=23; 44 int d=93232; 45 int e=914444; 46 int f=95555; 47 _group_assign(&group, group.size, &a); 48 /* groupに一人増えました */ 49 group.size++; 50 51 _group_assign(&group, group.size, &b); 52 group.size++; 53 54 _group_assign(&group, group.size, &c); 55 group.size++; 56 57 _group_assign(&group, group.size, &d); 58 group.size++; 59 60 _group_assign(&group, group.size, &e); 61 group.size++; 62 63 _group_assign(&group, group.size, &f); 64 group.size++; 65 66 /* 本命なぜ該当位置の値が取得できるのか不明 */ 67 /* ここでなぜ93232が返ってくるんじゃ??? */ 68 int answer = *(int*)_group_offset(&group, 3); 69 70} 71 72
回答いただきましてありがとうございます。
多くの方から回答をいただき、感謝しています。
一番わかりやすく丁寧だった方にBAをつけました。
また、コンパイルエラーについての意見がありました。
こちらは投稿者の中で意見が分かれましたが、当方コンパイルには特に問題なかったことやそれに類する参考意見も鑑み、問題なしとの見解に至っています。
低評価や修正依頼がついてしまったことは残念です。
しかし質問に対しては素晴らしい回答が得られたと思います。
回答5件
あなたの回答
tips
プレビュー