電子書籍の厳選無料作品が豊富!

c言語の学習をしています。
学習の上で、マイコン上の液晶上に処理した内容を表示しようと試行錯誤しているのですが、
以下2点教えていただきたいことがあります。

①malloc関数を使用しないで、メモリ領域を指定することは可能でしょうか?
 (静的アドレスで指定)

 簡単な変数であれば

 int* a =(int*)0x12345678;
のようにしてアドレスを指定可能ですが、

構造体の場合、アドレス位置を指定することはできるのでしょうか?
例えば、以下のような構造体を宣言、するとします。

typedef struct person {
char name[10];
char sex;
int age;
char add[10];
char job[10];
} person;

int main(void) {
person Test, *p1; //宣言
p1 = &Test; // 実体のアドレス代入
}

 これだと、Testを宣言した段階で、Test用の領域が確保されます。
 これを、指定したアドレス(0x12345678を先頭アドレスとして、使用可能なメモリ領域は確保できているものとします)に展開する方法を知りたいです。

person *p1 =0x12345678; //宣言

とかとすればOKなんでしょうか?



typedef struct person {
char *name;
char sex;
int age;
char *add;
char *job;
} person;

int main(void) {
person Test, *p1; //宣言
p1 = &Test; // 実体のアドレス代入
p1->name = "T.Tanaka";
p1->age = 20;
p1->add = "Tokyo";
}

このようにしている場合、
・"char *name"等の配列サイズは、コンパイル時に決まるのでしょうか?
・代入処理していない他のメンバ(sex,jobなど)はどのような扱いになるのでしょうか?(Nullが入る?それとも不定?不定だとchar型のポインタサイズはどれくらいになる?)

また、上記のような構造体の宣言の場合、
mallocを使用した動的メモリの処理はできないのでしょうか?
("char *name"の部分だと名前文字数が決まらない →配列サイズが決まらないため
 入力する文字数が分かっていればそれを加味してmalloc関数を使用すればOKなんでしょうか?)


分かりにくい質問で申し訳ありませんが、
よろしくお願いいたします。

A 回答 (3件)

構造体そのものはサイズ固定です。


なので sizeof(struct person) で定数を得ることができます。

上記の例だとnameなどのデータの実体は、
この構造体の領域から離れた場所に確保されることになります。
共有メモリなど自分でメモリ管理する必要がある場合、
サイズの変動要素をなくすと管理はしやすいです
(扱いやすいかどうかは置いといて)。
多少無駄が出るかもしれませんが、最大文字数を決めておいて、
#define NAME_LEN 20
...
char name[NAME_LEN];
のような感じにすれば、データまで含めてサイズ固定できます。

もちろん使途を自分で管理すれば、
この構造体を配列にして領域を確保したうえで、
リストのような使い方もできます。
    • good
    • 0

代入をしなければ「最初のまま」なのでそれがどうなるかという話.



規格上, 静的変数なら「0 で初期化」したのと同じ扱い. 動的変数では不定 (多くの処理系では「たまたまそこにあった値」を使うような気がする). 値は不定でも大きさは決まってるよ.
    • good
    • 0

① p1 =(person *)0x12345678; などとできます。


② 構造体にはポインタのみが含まれますのでサイズは固定できます。
  ポインタの指す位置にどういう文字列が入っていてもポインタは同じ大きさです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!