2017-02-20 3 views
-1

Cの構造体に少し新しく、配列を作成する際に問題があります。タイトルは、配列の配列をmallocしようとすると、配列が小さすぎてかなり大きなマージンになってしまいます。ここで構造体の配列をmallocingすると配列が小さすぎます

は私の構造体である:

struct Points 
{ 
    char file_letter; 
    char *operation; 
    int cycle_time; 
}; 

そして、ここでは、私は配列を作成しようとしている方法です:

struct Points *meta_data; 
meta_data = malloc(number_of_delims * sizeof(struct Points)); 

number_of_delimsは私がしようとしているポイントの数を表すintです私の配列内の要素の数を作成します。

number_of_delimsが64であることで、私は約8

ノートの配列のサイズを取得:これは学校のために多かれ少なかれプロジェクトであり、私の構造体を宣言するとき、私は教授としてtypedefを使用することはできません。それぞれの構造体が使用されるたびに明示的に1つずつ宣言されています。これは実際に私の問題の原因かもしれませんが、私たちは見るでしょう!この時点で

+1

'number_of_delimsが64で、配列サイズが約8です。これはどうやって分かりますか? – tkausl

+1

配列のサイズが約8であることをどのように知っていますか? – immibis

+1

'sizeof(meta_data)'は8かもしれませんが、それは配列のサイズではなくポインタのサイズになります。 – Dmitri

答えて

2
struct Points *meta_data; 

我々はstruct Points *型を持つオブジェクトの宣言、meta_dataを持っている...とstruct Points *、ポインタ型であり、典型的には共通の実装に8つのバイトを必要とします。これは、次のプログラムを介して観察可能である:

#include <stdio.h> 
struct Points; 
int main(void) { 
    struct Points *meta_data; 
    printf("sizeof meta_data: %zu\n", sizeof meta_data); 
} 

を覚えて、sizeofオペレータは、この場合、ポインタで発現のタイプの大きさを評価します。ポインタは、ポインタが指す配列に関するサイズ情報を保持しません。これを保持する必要があります(後で両方の値を入力する必要がある場合は、とnumber_of_delimsをペアにすることが望ましい)。 number_of_delimsが64であることで


私はあなたが正確に 64、あなたが期待きたようの配列のサイズを取得する約8

番の配列のサイズを取得します。あなたのポインタは自動的にそのサイズ情報を持ち歩くわけではありません(あなたが期待しているので)。したがって、割り当てには8つの要素しか格納できないという結論に至る移植可能な方法はありません。この結論に至る唯一の方法は、と誤って(つまり、私が説明したように期待通りに動作しないsizeofを試してみることです)です。練習として


あなたがそうのように、64 struct Pointsの配列へのポインタを宣言した場合、何が起こりますか?

struct Points (*foo)[64] = NULL; 

最初に、NULLにはいくつの要素が含まれていますか? sizeof foosizeof *fooとは何ですか? sizeofは、式のタイプのサイズを評価すると言っても意味が分かりますか?

+0

サイズを評価するために誤用されているsizeofに関する問題を理解していると思います私の配列の。私の問題は、私の配列を8回目の反復で反復的にセグメンテーションするため、幸せな偶然になるかもしれないと思います。私は私の質問は、私が少なくとも提供しているコードは正しいかどうか、私は別の場所で自分の問題を探しているのでしょうか? – AcuteAvocado

+0

@AcuteAvocadoもう一度投稿する前に[このFAQページ](http://stackoverflow.com/help/mcve)を読んでみてください。コミュニティの要件を理解するのは良い方法です彼らに助けを求める前に、あなた自身でこれらの問題をデバッグする方法を示すかもしれません。 P.S.あなたはvalgrindについて聞いたことがありますか? – Sebivor

+0

私のポストのノービスの性質をお詫びします。私は今このプログラムに立ち往生していました。私は質問を単純で直接的に保ちました。私はそれを試みたにもかかわらず、いくつかの礼儀を断念したかもしれません。私はもう少しやっていることを理解するのを助けるために時間を割いてくれてありがとう!私はvalgrindについて聞いたことはありませんが、クイック検索からはデバッガのように見えますか?私は現在GDBを使用していますが、それは私が見ることのできるいくつかの死んだ終わりを私に導きます。たぶん2番目の意見がそれに値するかもしれません。私が自分をどのようにして行ったかについて再び謝ります。 – AcuteAvocado