掲示板ランキング  その他フィッシング  グローブ  バット  スパイク  ボール  ウェア  ヘルメット


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7127

void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---buyoyokehime(2007/02/17 03:56:50)


 表題のとおりの意図で以下のようなコードを動かしてみましたが、配列各要素のアドレス配置が均一でないようです。自分なりにいろいろ試してみたのですが、どうもよく分かりませんでした。正しい方法を教えてください。よろしくお願いします。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  void **s;
  int i;
  int array_size = 10;
  int element_size = sizeof(char *);

  s = (void *) malloc(array_size * element_size);
  for (i=0; i<10; i++) {
    printf("%p\n", &s[i]);
  }

  return 0;
}

実行結果:
0x601010
0x601018
0x601020
0x601028
0x601030
0x601038
0x601040
0x601048
0x601050
0x601058


OS: Fedora6 x86_64
gcc 4.1.1


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。 7128 jazz 2007/02/17 08:34:13


No.7128

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---jazz(2007/02/17 08:34:13)


>配列各要素のアドレス配置が均一でないようです。

均一でないと判断されたのはなぜでしょうか?
出力結果は、16進で8バイトずつ増えていっています。
均一であると判断できるのではないでしょうか。





この投稿にコメントする

削除パスワード

No.7129

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---buyoyokehime(2007/02/17 18:07:37)


 失礼しましたそのとおりでした。
 実は、一つの構造体内に、サンプルのようにしていくつかの配列を割り当てたvoid**が宣言してありまして、その配列のある場所(例えば[6])に値をセットすると、先頭([0])の値が変化してしまうという訳のわからない現象が起きていまして、もしかして配列の確保の仕方が悪いのかと思って調べていて上のような勘違いをしてしまいました。
 上のような不可解な動作については、何かお心あたりはないでしょうか?



この投稿にコメントする

削除パスワード

No.7130

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---jazz(2007/02/17 18:23:45)


>上のような不可解な動作については、何かお心あたりはないでしょうか?

そのコードを見せてくださると、誰かが何かに気づくかもしれません。


この投稿にコメントする

削除パスワード

No.7132

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---chu-(2007/02/17 18:33:14)


C FAQ 4.9
http://www.kouno.jp/home/c_faq/c4.html#9

上記によると、「C言語には汎用のポインターへのポ インター型は存在しない。」とのことなので、
再現するコードを提示しないと話が進まないと思います。



この投稿にコメントする

削除パスワード

No.7188

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---yoh2(2007/02/26 22:05:05)


>C FAQ 4.9
>http://www.kouno.jp/home/c_faq/c4.html#9
>
>上記によると、「C言語には汎用のポインターへのポ インター型は存在しない。」とのことなので、

これ、リンク先の文章からは分かりづらいのですが、「(汎用のポインター)へのポインター型」が
存在しないのではなく、「汎用の(ポインターへのポインター型)」が存在しない、という意味です。
(汎用のポインター)へのポインター型」は存在します (それが void **型)。

原文(和訳に較べてかなり長いです。和訳後に追記されたのかも)を見れば分かると思います。
http://c-faq.com/ptrs/genericpp.html

buyoyokehimeさんが提示されたコード中では、(汎用のポインター)へのポインター型 を
使っているだけですので、その点に関しては問題ないと思います。


この投稿にコメントする

削除パスワード

No.7189

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---yoh2(2007/02/26 22:10:06)


ごめん、大ボケ。

>  int element_size = sizeof(char *);

>  s = (void *) malloc(array_size * element_size);

void **sを汎用の(ポインターへのポインター型)として使う意思が見て取れますね。
(sにcharへのポインターへのポインターを代入しようとしている)


この投稿にコメントする

削除パスワード

No.7190

Re:void**で宣言した変数に動的に配列を割り付けたいんですが。。。
投稿者---buyoyokehime(2007/02/27 02:06:14)


 いろいろ勉強になりました。皆様ありがとうございます。
 結局自分のコードは直せましたが、変な動作の原因はほとんどが単純ミスでした。
すいませんでした。
 あとは、構造体のメンバにvoid*型を宣言してから、あとで配列をmallocやcallocで割り付けようとしたらうまくいきませんでした。void*をラップする構造体を
別途定義して入れ子にする必要があるみたいです。理由がまだよく分からないのですが。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ