[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/31 10:23 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.49【環境依存OK】



1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

388 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 19:53:27 ]
これはひどい

389 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:04:00 ]
何がしたのか全然わからない

390 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:04:21 ]
何度基礎をやり直せと言ったことか

391 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:26:55 ]
なぜ、再使用しようとすると動的確保することになるのかもわからない。
文章で理由を説明してほしい。


392 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:36:55 ]
なるほど、stringが出来るわけだ

393 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:53:56 ]
おまえらほんと我慢強いよな。感心するよ
俺は>>386と同レベルのコードを保守する羽目になって殺意を覚えた。

394 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:00:35 ]
我慢強いというか、読んでない

395 名前:デフォルトの名無しさん [2008/02/23(土) 21:02:02 ]
C++の授業で先生が、
int main() {
int i;
cin>>i;
double a[i];
...
というコードはC++では出来ない(やりたいならnewでやるべき)と言われたのですが、
g++とiccではできました。これってだめだけど、gccやiccの拡張機能によって
できているのでしょうか?



396 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:04:05 ]
>>395
C++ が変化し続けているだけの話



397 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:09:33 ]
>>395
現状のC++標準規格じゃ無理。C99は可能。
C99サポートしてるコンパイラなら期待してもいい。

398 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:11:02 ]
newも使うべきではないよな。いやnew[]ではなくてstd::vector。

399 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:13:17 ]
C99は正直あんまやらないでほしい

400 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:18:40 ]
可変引数マクロはマジホシス

401 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:24:18 ]
0xでおk

402 名前:デフォルトの名無しさん [2008/02/23(土) 21:35:03 ]
おしえてください  下から2行目を動かすとデータが壊れるのですが原因がわかりません

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct STRDATA{ char **st; char **end; }strdata;

f(strdata x){ printf("%s",*(x.st)); }

strconv(strdata *q, char **p){
char **chend =(char **)malloc(sizeof(char **));
q->st=p;
*chend=&(*p)[strlen(*p)];
q->end = &(*chend);}

strconstconv(strdata *q, char *p){
int n=strlen(p);
char *ch=(char *) malloc(n+1);
strcpy(ch,p);
q->st=&ch;
char **chen =(char **)malloc(sizeof(char **));
*chen=&(ch[n]); q->end = &(*chen);}

main(){
strdata str;
#define STR "abcdefgh"
strconstconv(&str, STR); //ここをコメントアウトして一つ下を動かしても平気です
//char *ch=new char [50]; strcpy(ch,STR); strconv(&str,&ch);
//char *x=new char [1];  ここを動かすとおかしくなります
f(str); }

403 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:37:15 ]
もうお前いい加減諦めたら。

ローカル変数のアドレスを関数外に持ち出すな。

404 名前:デフォルトの名無しさん [2008/02/23(土) 21:39:05 ]
char *x=new char [1]; が、なぜstrdata strを書き換えられるんでしょうか?

405 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:39:21 ]
なんかまぁ・・・・・・いろいろとおつかれさん

406 名前:402 [2008/02/23(土) 21:45:20 ]
おなじやつですが短くしました 下から2行目を動かすと壊れるのはなぜでしょうか

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct STRDATA{ char **st; char **end; }strdata;

f(strdata zzz){ printf("%s",*(zzz.st)); }

strconstconv(strdata *q, char *p){
int n=strlen(p);
char *ch=(char *) malloc(n+1);
char **chen =(char **)malloc(sizeof(char **));
strcpy(ch,p);
q->st=&ch;
*chen=&(ch[n]); q->end = &(*chen);}

main(){
strdata str;
strconstconv(&str, "abcdefgh");
// char *test=new char [1];
f(str); }



407 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:46:36 ]
まず変数のスコープを勉強しよう

408 名前:402 [2008/02/23(土) 21:48:09 ]
なぜコメントアウトを外すとデータがこわれますか?

409 名前:デフォルトの名無しさん [2008/02/23(土) 21:53:31 ]
newやmallocの確保は、解放しない限り残るんですよね そのアドレスは参照で受け取っているので問題ないと思うのですが
参照渡しにしてもだめです

f(strdata *zzz){ printf("%s",*(zzz->st)); }

main(){
strdata str;
strconstconv(&str, "abcdefgh");
f(&str); }

410 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:54:33 ]
基礎からやりなおせよ

411 名前:デフォルトの名無しさん [2008/02/23(土) 21:56:58 ]
ヒントください

412 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:57:01 ]
いいから基礎からやりなおせって。スタックとヒープの概念すら分かってないだろ。

413 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:57:11 ]
>>409
トリップをつけてくれるとあぼーんしやすいのですがいかがでしょうか

414 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:00:25 ]
スタックとかヒープとか、この際関係ないレベルじゃん

415 名前:デフォルトの名無しさん [2008/02/23(土) 22:02:39 ]
より短くしました これでも外すと壊れます なぜですか?

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; char **end; }strdata;

f(strdata *q){
char *ch=(char *) malloc(10);
strcpy(ch,"abcdef");
q->st=&ch; }

g(strdata *zzz){ printf("%s",*(zzz->st)); }

main(){
strdata str; f(&str);
//char *test=new char [1];
g(&str); }

416 名前:デフォルトの名無しさん [2008/02/23(土) 22:03:36 ]
>>409
多少手を入れて(int mainとするとか)こっちで動かしてみましたが、ちゃんとabcdefghと表示されました。

でも、newだけc++の機能をつかってるけど、あとは全部(結構年季が入った感じの)cだし、
c++のコンパイラなら、関数の戻り値を指定しないのはダメだと思うし、
mallocとnew は併用したらダメだってどこかで聞いたけどな。

いまいちやろうとしていることの意図がつかめません。
(mallocとnewを併用して、どういう状況でまずいのかしらべようとしているのか)

もしc++を勉強しようとしているなら、なにか適当な本とかで勉強するのを勧めます。
Cを上記くらいご存知なら、すぐにC++も使えるようになりますよ。




417 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:03:53 ]
ヒントもなにも>>403がずばり回答してるんだが。
これでもわからないなら、なんでもいいからポインタの無い言語に行ってくれ。
そして帰ってくんな。

418 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:08:06 ]
>>415
なんでお前は答えを貰っても全くレスポンスを返さずに、
そんなヘドロみたいなコードを貼り続けるんだ。

頭沸いてるのか

419 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:08:35 ]
>>415
これなら動く。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char *st;
    char *end;
} strdata;

void f(strdata *q) {
    char *ch=(char *)malloc(10);
    strcpy(ch,"abcdef");
    q->st = ch;
}

void g(strdata *zzz) {
    printf("%s", zzz->st));
}

int main() {
    strdata str;
    f(&str);
    g(&str);

    return 0;
}

420 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:11:12 ]
>>419
おまいやさしいな

421 名前:デフォルトの名無しさん [2008/02/23(土) 22:14:15 ]
>>419
それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 
削ったのですがこれでも原因が不明です コンパイラはBCC5.5です

#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; }strdata;

f(strdata *q){
char *ch=(char *) malloc(10);
ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0;
q->st=&ch; }

main(){
strdata str; f(&str);
//char *test=(char *) malloc(1);
printf("%s",*(str.st));}

422 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:17:54 ]
>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 

( ゚д゚) ・・・
 
(つд⊂)ゴシゴシ
 
(;゚д゚) ・・・
 
(つд⊂)ゴシゴシゴシ
  _, ._
(;゚ Д゚) …!?

423 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:17:55 ]
419でどこの文字列がどう書き換えられないっていうんだ言ってみろ

424 名前:デフォルトの名無しさん [2008/02/23(土) 22:20:55 ]
VCCやGCCやDMCでも実行中にエラーになります

#include <stdio.h>
#include <stdlib.h>
typedef struct { char **st; }strdata;

void f(strdata *q){
char *ch=(char *) malloc(10);
ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0;
q->st=&ch; }

int main(){
strdata str;
char *test;
f(&str);
test=(char *)malloc(1);
printf("%s",*(str.st));
getchar(); return 0;}

425 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:21:34 ]
>>421
>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 
wwwwwwwwwwwwwwwwwwwwwww
>>419よ、これが現実だwwwwwアホは相手にするなwwwwww


426 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:22:15 ]
ぶっちゃけポインタ全く理解してないだろ。



427 名前:421 [2008/02/23(土) 22:26:27 ]
誤解していましたすみません 

428 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:28:05 ]
さすがに・・・

初心者を抜け出した程度の俺でも酷いと思うw

429 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:28:08 ]
>>424
変数testの用途が不明だったので、削除させてもらった。

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char *st;
}strdata;

void f(strdata *q) {
    char *ch = (char *)malloc(10);
    ch[0] = 'X';
    ch[1] = 'Y';
    ch[2] = 'Z';
    ch[3] = '\0'; //まあ0のままでもいいんだけど
    q->st = ch;
}

int main() {
    strdata str;
    f(&str);
    printf("%s", str.st);
    getchar();
    free(str.st);
    return 0;
}


430 名前:421 [2008/02/23(土) 22:28:56 ]
すみません 誤解していませんでした 書き換えられません

#include <string.h>
#include <stdio.h>
typedef struct { char *st; }strdata;

f(strdata *x){
delete x->st;
x->st = new char [9];
strcpy(x->st,"++++++"); }

main(){
char *ch=NULL;
strdata x;
x.st=ch;
f(&x);
printf("%s",ch);}

431 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:34:49 ]
>>430
お前が421や424で書いたコードは
>printf("%s",*(str.st)); 
だったのになぜ
>printf("%s",ch);
になってるんだ?納得のいく説明を聞こうか?

432 名前:デフォルトの名無しさん [2008/02/23(土) 22:34:55 ]
>>429
int main() {
strdata str;
f(&str); ←ここで初期化された文字列の内容、長さを変更したいんです あと変数testほ確保しても落ちないようにしたいんです
printf("%s", str.st);

みなさんは、>>424はまともに動きますか?

433 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:37:26 ]
>>432
動かすまでもなく、まともに動かないのは分かる

434 名前:430 [2008/02/23(土) 22:37:28 ]
>>335>>343>>348>>351がもともとの質問でこれを実現したいんです

435 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:37:36 ]
>>430
printf("%s",ch);をprintf("%s",x.st);とすればいい。
嫌か?
じゃあこれでどうだ。
#include <string.h>
#include <stdio.h>
typedef struct {
    char *st;
} strdata;

void f(strdata *x) {
    delete x->st;
    x->st = new char[9];
    strcpy(x->st,"++++++");
}

int main() {
    char *ch = NULL;
    strdata x;
    x.st = ch;
    f(&x);
    ch = x.st;
    printf("%s",ch);
    delete[] ch;

    return 0;
}

436 名前:デフォルトの名無しさん [2008/02/23(土) 22:39:36 ]
>>433
test=(char *)malloc(1);をはずすと上手くいきます なぜですか



437 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:40:58 ]
>>436
それは上手く動いてるんじゃなくて、たまたま動いてるだけ

438 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:41:46 ]
>>335
をチラ見しかしてないけどそれが動くことがとても不思議。
とりあえず期待する動作はなんなのかを日本語で書いてください。

439 名前:デフォルトの名無しさん [2008/02/23(土) 22:42:06 ]
>>435
それだと始めにchが巨大に確保されていたらメモリーリークになると思うのですが

440 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:43:20 ]
>>436
偶然。

あのコードでは、すでになくなったローカル変数を読み取ろうとしている。
運良くメモリ上に残っていれば、一見正しく動いているように見える。
そのtestの行は、残っていた変数の値を破壊する決定打になったのだろう。

441 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:43:21 ]
>>439
思うだけだ

442 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:44:24 ]
見る気もしない。
高速スクロールで華麗にスルー。
違うお題ないの?

443 名前:デフォルトの名無しさん [2008/02/23(土) 22:46:11 ]
Perlで言うところの

use LWP::Simple;
sub foo{ return get('ttp://hoge.com/fuga.zip'); }

これをVC++で極力シンプルにやるにはどうすればいいでしょうか?
環境は以下のとおりです。

VisualC++.net2003 Standard
managedC++不使用 MFC不使用 ATL/WTL使用 STL/Boost使用

444 名前:デフォルトの名無しさん [2008/02/23(土) 22:46:57 ]
>>438
バイナリ文字列 (\0を含む) の初めと終わりを構造体で関数に渡して、バイナリ文字列の内容、長さを書き換えたいんです

445 名前:444 [2008/02/23(土) 22:48:45 ]
純粋なC言語だけでそれを実現したいんです 

446 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:49:59 ]
>>445

一般的に知られている C言語の定義とは違うものを扱ってらっしゃるのですね



447 名前:デフォルトの名無しさん [2008/02/23(土) 22:50:53 ]
最終的には、C言語のみにしますけど今は実験段階なので・・・

448 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:52:02 ]
>>444
なんでchとかtestとか別の変数が出てくるの?
構造体のまま扱い続ければいいでしょ。

449 名前:443 mailto:sage [2008/02/23(土) 22:54:26 ]
>>443
単純にC++でネット上のものをダウンロードさせるには
どうすればいいですか?って聞くべきだった orz

450 名前:デフォルトの名無しさん [2008/02/23(土) 22:55:14 ]
chは現物の文字列です この初めと終わりのアドレスを構造体で渡して変化させるようにしたいんです

451 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:55:32 ]
本でも読んで出直してこいよ
本格的に他人に頼りたいなら金でも払え

452 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:59:15 ]
現物の文字列ってなんだよ
ただのポインタだろ
str.st と等価だ

453 名前:デフォルトの名無しさん [2008/02/23(土) 23:01:55 ]
たとえば、
char *ch=new char [100]; strcpy(ch, "---------");
という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです

454 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:04:50 ]
何にそんなもんをつかうんかわからんが
とりあえずそんなことを考える前に
入門書なりきちんと読め。
たのむから

455 名前:デフォルトの名無しさん [2008/02/23(土) 23:09:26 ]
初めの文字列が200M程度確保されていたとして作業領域も200M使うとします
このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません
しかし、それができずに返却すると最大 200M + 200M + 200M必要になります

456 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:11:03 ]
>>449
ソケット使ってカリカリやるしか思いつかん



457 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:11:12 ]
>>443
手軽さならWinInet
真剣にやるならWinsock

458 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:13:38 ]
>>450
435みたいに、構造体で渡した後、元の変数に代入し直せばいい。

459 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:15:30 ]
もはやポインタいらんがなw

460 名前:デフォルトの名無しさん [2008/02/23(土) 23:19:19 ]
文字列ではなく、1byte変数の配列を可変長で扱いたいと。
だったら、
typedef struct {
char *baka;
size_t length;
} aho;

とでもして、構造体をやり取りすればいいだろ。
C++だったら、vector<char>、deque<char>でも使えや。

461 名前:443 mailto:sage [2008/02/23(土) 23:20:13 ]
WinInetででググったらいっぱい出てきたんで調べてみる。
サンクス

462 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:20:26 ]
>>443
URLDownloadToFile

463 名前:デフォルトの名無しさん [2008/02/23(土) 23:26:44 ]
>>458
なぜ直接書き換えられないのかわかりません

464 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:29:10 ]
>>463
こっちからしてみたら、なんで構造体を使いたくないのかわからない。

465 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:29:25 ]
>>463
もっと勉強してから出直せ

466 名前:デフォルトの名無しさん [2008/02/23(土) 23:40:17 ]
もともと構造体は使っていますよ あとC言語のみで動かせるようにしたいんです
開始のアドレスと長さを渡しても上と同じだと思います



467 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:41:34 ]
あぼーんしたいからトリップつけてくれ

468 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:44:18 ]
たぶんトリのつけ方を知らない。
「名前欄にレス番つけること」すら今日知ったっぽい

469 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:44:39 ]
釣りだろう

470 名前:デフォルトの名無しさん [2008/02/23(土) 23:46:32 ]
文字列を入力して、
表示するとき右から3文字ごとにコンマをつける方法ってどうすれば?
(例:入力>>344fru38fh4tgiur
   出力>>3,44f,ru3,8fh,4tg,iur)
この続きお願いします・・
#include <iostream.h>
main()
{
char a[50] ;
cout <<"aに文字を入力してください>>" ;
cin.getline(a, 50) ;

int a_count = 0 ;
while( a[a_count] != '\0'){
a_count++ ;
}

cout <<"aを表示します→" ;
for(int i=0 ; i<a_count ; i++){
cout << a[i] ;
}
}


471 名前:デフォルトの名無しさん [2008/02/23(土) 23:48:55 ]
これがたまたまうまく動いたりしますが、実際は間違っているから困っているんです

#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;

void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }

main() {
char *ch = new char [2];
strcpy(ch,"a");
bin x;
x.start=ch; x.end=ch+strlen(ch);
f(&x);
printf("%s",ch);
}

472 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:50:11 ]
>>470
www.google.co.jp/search?q=C%2B%2B+3%E6%A1%81+%E3%82%B3%E3%83%B3%E3%83%9E&btnG=%E6%A4%9C%E7%B4%A2&lr=

473 名前:デフォルトの名無しさん [2008/02/23(土) 23:53:13 ]
x.start=ch; とした時点で、数値がコピーされるだけになり、文字列を書き換えられなくなります
だから x.start=&ch;と参照渡しをするために
構造体を { char **start ; char **end; }に変更します
そうすると上記のような現象が出ます

474 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:53:48 ]
>>471
f(&x);
ch=x.start;
printf("%s",ch);
でいいだろ
って・・・釣られちまったよ〜〜〜〜ん

475 名前:デフォルトの名無しさん [2008/02/23(土) 23:56:53 ]
>>473
fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?

476 名前:475 [2008/02/23(土) 23:57:42 ]
×>>473
>>471



477 名前:デフォルトの名無しさん [2008/02/24(日) 00:03:07 ]
>>475
>>471ではdeleteやnewが効かない場合があるんです これはちゃんと表示されますか?

#include <stdio.h>
#include <string.h>
typedef struct { char *start ; char *end; } bin;

void f(bin *x) {
delete x->start;
x->start = new char [3];
strcpy(x->start,"aa"); }

main() {
char *ch = NULL;
bin x;
x.start=ch;
f(&x);
printf("%s",ch);}

478 名前:デフォルトの名無しさん [2008/02/24(日) 00:06:58 ]
Cで動くようにしたいとかホザいておきながら、new や deleteを使うバカ
しかも、

baka = new aho[shine];

としたら

delete []baka;

とすることしら知らないバカ。
マニュアルでも読め

479 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:07:28 ]
>>477
じゃあもういいから、こうしとけ
#include <stdio.h> 
#include <string.h> 
typedef struct { char **start ; char **end; } bin; 

void f(bin *x) { 
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"aa"); } 

void g(bin *x) {
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"bb"); } 

main() { 
char *ch = NULL; 
bin x; 
x.start=&ch; 
f(&x); 
printf("%s",ch);
g(&x); 
printf("%s",ch);
}
これで終了、もう来るな

480 名前:デフォルトの名無しさん [2008/02/24(日) 00:08:23 ]
>>477
deleteもnewも効いているはずだよ?

・chが指す先をdeleteしようが、x->start=new・・・をしようが、chの中身は変わらない。
・deleteしても絶対に書き込めなくなるとは限らない。

これらは理解している?

481 名前:not 477 [2008/02/24(日) 00:10:08 ]
>>478
あ・・・そういえばdelete []baka;としないといけなかったんだ・・・・
C厨ですまん。

482 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:15:24 ]
構造体はCでないというつもりか?

483 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:17:32 ]
>>477
main関数内、chだけに注目すれば、
chはNULLで初期化された後、一切変更を受けないだろ。
printfにNULLを渡しているので、未定義。

484 名前:デフォルトの名無しさん [2008/02/24(日) 00:18:48 ]
>>479
それだと、 bin x;を初期化する関数と、適当な配列を入れるとバグるんです なんでうごかないんですか

#include <stdio.h>
#include <string.h>
typedef struct { char **start ; char **end; } bin;

void f(bin *x) {
delete[] *x->start;
*x->start = new char [3];
strcpy(*x->start,"aa"); }

void h(bin *x){
char *ch=new char [3];
ch[0]='X';ch[1]=0;
x->start=&ch; }

main() {
bin x;
h(&x);
f(&x);
char *test=new char [1];
printf("%s",*(x.start));
}

485 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:23:27 ]
バグるじゃ分らんだろ。

486 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:24:02 ]
>>484
h内のローカル変数chのアドレスをx->startに格納しているが、
chはhを抜けると無くなるので、x->startは存在しない場所を指している。



487 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 00:24:26 ]
>>484
じゃあこれでいいだろう
#include <stdio.h> 
#include <string.h> 
typedef struct { char **start ; char **end; } bin; 

void f(bin *x) { 
delete[] *x->start; 
*x->start = new char [3]; 
strcpy(*x->start,"aa"); } 

char *ch;
void h(bin *x){ 
ch=new char [3]; 
ch[0]='X';ch[1]=0; 
x->start=&ch; } 

main() { 
bin x; 
h(&x); 
f(&x); 
char *test=new char [1]; 
printf("%s",*(x.start)); 
}

488 名前:デフォルトの名無しさん [2008/02/24(日) 00:25:03 ]
char *test=new char [1];をのぞくと、bcc5.5では動作します
ほかのコンパイラでは、入れなくても実行時に落ちます 原因は何ですか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef