構造体のメンバにCStringを使用する方法 – プログラミング – Home

構造体のメンバにCStringを使用す...
 
通知
すべてクリア

[解決済] 構造体のメンバにCStringを使用する方法

固定ページ 1 / 2

ぴかりん
 ぴかりん
(@ぴかりん)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

はじめまして ぴかりんです

初歩的な質問ですみませんがよろしくお願いします

メンバに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++;

}

}


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

クラスを含む構造体(非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も)に対してする。


返信引用
ぴかりん
 ぴかりん
(@ぴかりん)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

Blueさん お返事ありがとうございます

今後のためにもどうしてもCStringを使いたいので下記のようにやってみましたが、

やはりアクセスバイオレーションが発生します

これはnewの使い方がおかしいのでしょうか?

やりたいことは CCCの構造体の領域を可変でデータ分だけ確保する

ということです。

ご教授のほどよろしくお願いいたします。

typedef struct{
CString AAA;
CString BBB;
}CCC;

--------------------------------
void ddd()
{
ccc* pccc;

while(1)
{
pccc = new CCC;

pccc->AAA = 1234;  ← ここでおちる

pccc++;

}

}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>while(1)
無限ループ?

> pccc++;
これなんでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

無限ループでnewを繰り返せばそりゃいつかは落ちるべなぁ。


返信引用
ぴかりん
 ぴかりん
(@ぴかりん)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

while(1)の無限ループは例で
実際はデータ数分ループさせようと思ってます

pccc++は
それで CCC型のポインタ pcccをCCCサイズ分メモリ領域をずらして
次のデータの領域を確保しようとしています。

newを使用する場合はこんな使い方はしないんでしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

あと、ccc* pccc; このcccはCCCの間違いでは?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

N個分の連続領域が欲しいなら

CCC* p = new CCC[N];
for ( int i = 0; i < N; ++i ) {
p[i].AAA = 1234;
}
...
delete[] p;

ですが。


返信引用
ぴかりん
 ぴかりん
(@ぴかりん)
ゲスト
結合: 18年前
投稿: 5
Topic starter  

お返事ありがとうございます

たいちうさん > その通りです CCCの間違いでした

N個分の領域がほしいのはほしいんですが、そのN個ってのが可変で

毎回数が変わります

なのでファイルからデータを取得し、領域を確保して保存

というのを繰り返してデータ分だけ領域を確保したいと思ってます

newはそういう使用方法はありませんでしょうか?

省略~

CCC *p;

while( fgets(cWork,10,fp) != NULL )
{
p = new CCC;

p.AAA = cWork;

p++;
}

こんなイメージです

もしよい方法がありましたらご教授願います

よろしくお願いします


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> CCC* p = new CCC[N];

この N を変数にすればよろしい。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> while( fgets(cWork,10,fp) != NULL )
> {
> p = new CCC;
> p.AAA = cWork;
> p++;
> }

ちょっと待てどんなイメージだそれ。
1行読むごとに CCC を何個確保したいかが変わるの?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

動的配列使ったほうがよさげ。
そうすればポインタなんて関係ないかと。

#include <afxtempl.h>

CArray<CCC, CCC> ary;
CCC c;

while ( XXXX )
{
c.AAA = xxxxx;
ary.Add( c );
}


返信引用
チョーヤ
 チョーヤ
(@チョーヤ)
ゲスト
結合: 18年前
投稿: 5
 

pccc->AAA = 1234;  ← ここでおちる

-----------------------------
2回目のループで落ちます。

なぜなら、pccc++;この処理で、領域を確保していないところにpcccが移動するから。

pcccはCCC構造体をいれるポインター領域です。
この領域は最初の宣言CCC* pccc;で確保しています。
なので、『pccc = new CCC』で確保したポインターを代入するのはOK。
でも、pccc++;でpcccが領域確保していない所に移動するので、
この領域に『pccc = new CCC』するのは駄目。
(既にこの時点でおかしな事になってるが、なんとかがんばって動き)
pccc->AAA = 1234;  ← ここで力尽きる。。。

といった感じかと・・・・


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> なぜなら、pccc++;この処理で、領域を確保していないところにpcccが移動するから。

ホントか?
その後 pccc = new CCC; によってpcccを書き換えてるんだから、
「pccc++ する意味がなくなる」だけじゃね?


返信引用
チョーヤ
 チョーヤ
(@チョーヤ)
ゲスト
結合: 18年前
投稿: 5
 

補足。

CCCがwhileの中だけしか使わないのであれば下でいけます。

-----------------------------------------------------------
CCC *p;

while( fgets(cWork,10,fp) != NULL )
{
p = new CCC;

p.AAA = cWork;

delete p;
}
-----------------------------------------------------------


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました