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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
構造体そのものはサイズ固定です。
なので sizeof(struct person) で定数を得ることができます。
上記の例だとnameなどのデータの実体は、
この構造体の領域から離れた場所に確保されることになります。
共有メモリなど自分でメモリ管理する必要がある場合、
サイズの変動要素をなくすと管理はしやすいです
(扱いやすいかどうかは置いといて)。
多少無駄が出るかもしれませんが、最大文字数を決めておいて、
#define NAME_LEN 20
...
char name[NAME_LEN];
のような感じにすれば、データまで含めてサイズ固定できます。
もちろん使途を自分で管理すれば、
この構造体を配列にして領域を確保したうえで、
リストのような使い方もできます。
No.2
- 回答日時:
代入をしなければ「最初のまま」なのでそれがどうなるかという話.
規格上, 静的変数なら「0 で初期化」したのと同じ扱い. 動的変数では不定 (多くの処理系では「たまたまそこにあった値」を使うような気がする). 値は不定でも大きさは決まってるよ.
No.1
- 回答日時:
① p1 =(person *)0x12345678; などとできます。
② 構造体にはポインタのみが含まれますのでサイズは固定できます。
ポインタの指す位置にどういう文字列が入っていてもポインタは同じ大きさです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語にて構造体のメンバがNULL...
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
new charとnew char[N]の違いは?
-
SubStringの使い方について
-
カンマで区切った文字の抽出に...
-
文字列の途中から途中までを抽出
-
コマンドライン引数 *argv[]は...
-
'\\0'とはなんですか?
-
C言語の文字リテラル中の16進文...
-
strcpy関数で文字型変数へのポ...
-
関数について
-
char[]をDWORDに格納するには
-
動的メモリの初期化方法について。
-
DWORDとcharの変換
-
csvファイルをfscanfで読み込む...
-
fstream型オブジェクトを関数の...
-
エクセルのMID関数は、C言語では?
-
C言語のintとcharの違いってな...
-
構造体・ビットフィールドのvol...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
strcat関数を自作したいです
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
char型にint型の数値を代入する。
-
文字列の途中から途中までを抽出
-
new charとnew char[N]の違いは?
-
文字列内の数字削除
-
csvファイルをfscanfで読み込む...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
エクセルのMID関数は、C言語では?
-
ポインタを使って回文かどうか...
-
ポインタ配列
おすすめ情報