はじめまして ぴかりんです
初歩的な質問ですみませんがよろしくお願いします
メンバにCStringを持つ構造体を作成しまして、そのポインタを宣言します
その後にそのポインタの実体をmallocで定義し、値をセットしようとすると
アクセスバイオレーションになってしまいます
CStringのメンバをChar[256]とかに変えてやってみると正常にセットできるのですが
CStringを構造体で使用する場合 なにか注意などあるのでしょうか?
また、下記のように ループで構造体の実体を1つづつ確保していく方法ですが
構造体のポインタを構造体分++する
構造体のサイズ分 mallocで確保する
この方法で問題なくできますでしょうか?
大変初歩的な質問で申し訳ありませんが よろしくお願いいたします。
typedef struct{
CString AAA;
CString BBB;
}CCC;
--------------------------------
void ddd()
{
ccc* pccc;
while(1)
{
pccc = (CCC*)malloc(sizeof(CCC));
pccc->AAA = 1234; ← ここでおちる
pccc++;
}
}
クラスを含む構造体(非PODな構造体)をmallocで使うことは出来ないでしょう。
newを使えば、CStringのコンストラクタも動きます。
newをつかないのであれば、CStringをメンバにするのは不可能です。
char*にして_strdupとかを使ってください。
typedef struct{
char* AAA;
char* BBB;
}CCC;
pccc = (CCC*)malloc(sizeof(CCC));
pccc->AAA = _strdup(1234);
当然 free は pccc と pccc->AAA(pccc->BBBも)に対してする。
Blueさん お返事ありがとうございます
今後のためにもどうしてもCStringを使いたいので下記のようにやってみましたが、
やはりアクセスバイオレーションが発生します
これはnewの使い方がおかしいのでしょうか?
やりたいことは CCCの構造体の領域を可変でデータ分だけ確保する
ということです。
ご教授のほどよろしくお願いいたします。
typedef struct{
CString AAA;
CString BBB;
}CCC;
--------------------------------
void ddd()
{
ccc* pccc;
while(1)
{
pccc = new CCC;
pccc->AAA = 1234; ← ここでおちる
pccc++;
}
}
>while(1)
無限ループ?
> pccc++;
これなんでしょうか?
無限ループでnewを繰り返せばそりゃいつかは落ちるべなぁ。
while(1)の無限ループは例で
実際はデータ数分ループさせようと思ってます
pccc++は
それで CCC型のポインタ pcccをCCCサイズ分メモリ領域をずらして
次のデータの領域を確保しようとしています。
newを使用する場合はこんな使い方はしないんでしょうか?
あと、ccc* pccc; このcccはCCCの間違いでは?
N個分の連続領域が欲しいなら
CCC* p = new CCC[N];
for ( int i = 0; i < N; ++i ) {
p[i].AAA = 1234;
}
...
delete[] p;
ですが。
お返事ありがとうございます
たいちうさん > その通りです CCCの間違いでした
N個分の領域がほしいのはほしいんですが、そのN個ってのが可変で
毎回数が変わります
なのでファイルからデータを取得し、領域を確保して保存
というのを繰り返してデータ分だけ領域を確保したいと思ってます
newはそういう使用方法はありませんでしょうか?
省略~
CCC *p;
while( fgets(cWork,10,fp) != NULL )
{
p = new CCC;
p.AAA = cWork;
p++;
}
こんなイメージです
もしよい方法がありましたらご教授願います
よろしくお願いします
> CCC* p = new CCC[N];
この N を変数にすればよろしい。
> while( fgets(cWork,10,fp) != NULL )
> {
> p = new CCC;
> p.AAA = cWork;
> p++;
> }
ちょっと待てどんなイメージだそれ。
1行読むごとに CCC を何個確保したいかが変わるの?
動的配列使ったほうがよさげ。
そうすればポインタなんて関係ないかと。
#include <afxtempl.h>
CArray<CCC, CCC> ary;
CCC c;
while ( XXXX )
{
c.AAA = xxxxx;
ary.Add( c );
}
pccc->AAA = 1234; ← ここでおちる
-----------------------------
2回目のループで落ちます。
なぜなら、pccc++;この処理で、領域を確保していないところにpcccが移動するから。
pcccはCCC構造体をいれるポインター領域です。
この領域は最初の宣言CCC* pccc;で確保しています。
なので、『pccc = new CCC』で確保したポインターを代入するのはOK。
でも、pccc++;でpcccが領域確保していない所に移動するので、
この領域に『pccc = new CCC』するのは駄目。
(既にこの時点でおかしな事になってるが、なんとかがんばって動き)
pccc->AAA = 1234; ← ここで力尽きる。。。
といった感じかと・・・・
> なぜなら、pccc++;この処理で、領域を確保していないところにpcccが移動するから。
ホントか?
その後 pccc = new CCC; によってpcccを書き換えてるんだから、
「pccc++ する意味がなくなる」だけじゃね?
補足。
CCCがwhileの中だけしか使わないのであれば下でいけます。
-----------------------------------------------------------
CCC *p;
while( fgets(cWork,10,fp) != NULL )
{
p = new CCC;
p.AAA = cWork;
delete p;
}
-----------------------------------------------------------