- 締切済み
new、memset()、エラー
taka_tetsuの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>>#include <memory.h> >>にしてみて下さい。 >しません。 ??? memory.hかstring.hのヘッダ追加しないとコンパイル通らないはずなんですが・・・ もし、ワーニングだけで、実行ファイルができてしまっているのであれば、単純に関数の呼び出しに失敗して落ちているだけです。 素直にヘッダを追加しましょう。 >new は何型を返すんですか? 指定したクラスのポインタを返します。 >new して確保した領域のメモリは全て0で初期化されますか? されません。
関連するQ&A
- new演算子とインクリメント
#include <iostream.h> main(){ char *str = new char[10]; memset(str, 0, 10); char *p = str; *p = 1; printf("%x", *p); delete [] str; } これで0が出力されるけど、*p = 1; を *p += 1; にすると *p += 1; の部分の実行時にエラーでフリーズしました。 この場合、*p += 1; と書いてはだめなのですか? *p = 1; との違いがあれば教えてください。
- ベストアンサー
- C・C++・C#
- C++のnew演算子で動的確保
new()を初めて使ってみました。 エラーは無かったけど、間違いがあったら教えてください。 #include <iostream.h> main(){ int n = 0; char* str = "mojisuufumei"; char* myValue; while(!str[n])n++; myValue = new char[n+1]; strcpy(myValue, str); cout << myValue; delete []myValue; } char*型のmyValueを動的確保したつもりです。 myValue[0], myValue[1], … のそれぞれの値を unsignedにして宣言したい場合はどうしたらいいんですか? #include <iostream.h> main(){ int n = 0; char* str = "mojisuufumei"; unsigned char* myValue; while(!str[n])n++; myValue = new unsigned char[n+1]; strcpy(myValue, str); cout << myValue; delete []myValue; } だと、strcpy()のとこでコンパイルエラーでした。
- 締切済み
- C・C++・C#
- newかFILEでエラーのような
エラーがおこらないと思うんだけど、実行時エラーです。 コンソールアプリケーションのソースを見てください。 fclose(fp); を2行上に移動した場合はエラーにはなりません。 これはどうしてエラーになるんですか? test.txtは、同じディレクトリにある0バイトのファイルです。 #include <windows.h> #include <iostream.h> int main(){ WIN32_FIND_DATA finddata; FILE *fp; char *str; char **pp; FindClose(FindFirstFile("test.txt", &finddata)); fp = fopen("test.txt", "r"); if(fp){ str = new char[14]; fclose(fp); strcpy(str, "abcdefghijklm"); pp = new char*[3]; pp = &str; delete [] *pp; delete [] str; }else cout << endl; return 0; }
- ベストアンサー
- C・C++・C#
- newについて
newを使った場合、3バイト分確保したつもりでしたが、7バイト?になります。どうしてでしょうか? newした場合はdeleteをしないといけませんが、deleteした後にNULLで初期化する意味はあるのでしょうか? CとC++が混在?(newはC++かな?)しているソースなのですが、 現場(クリティカルな開発)ではこういう書き方はNGでしょうか? 組み込み系のお仕事をされている方の意見も聞きたいです。 #include <string.h> void main(void){ char *cstr = new char [3]; printf("%d\n", strlen(cstr)); // 3を期待していたのですが、7になります。 if (cstr != NULL){ delete cstr; cstr = NULL; } }
- ベストアンサー
- C・C++・C#
- 多次元配列の new 2
追加の質問ですみません^^; char の8個の配列へのポインタの配列を new する場合などは、以下のサンプルのように typedef しないとかけないんでしょうかね?たとえば、 char (**bb)[8] = new (char (*)[8])[8]; 書きたいように思いますが、これは文法違反ですし・・・^^; ==== サンプル:(iostream の初期化時に、定義した new が呼び出されるかもしれないことを一応考慮して、stdio の関数を使っています^^) #include <new> #include <stdlib.h> #include <stdio.h> void *operator new(std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new(): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete(void *p) { fprintf(stderr, "::delete(): %p\n", p); if (p) free(p); } void *operator new[](std::size_t s) { void *p = malloc(s); fprintf(stderr, "::new[](): %p\t%lu\n", p, (unsigned long)s); return p; } void operator delete[](void *p) { fprintf(stderr, "::delete[](): %p\n", p); if (p) free(p); } int main() { typedef char (*T)[8]; char (**b)[8] = new T[8]; delete[] b; } ==== % ./a.exe ::new[](): 0x6e01b0 32 ::delete[](): 0x6e01b0
- ベストアンサー
- C・C++・C#
- ポインタのポインタの使い方
文字列の途中からの部分を表示させる場合もあって、途中からの 位置というのをcahr**型の配列に記憶させることにしました。 ポインタとnewがよく分からないから、それに近いサンプルを 作って実験しているところです。 #include <iostream.h> main() { char selected[][6] = {"full", "nomal", "short"}; char *buf; char **p; buf = new char[500]; strcpy(buf, ",東京都,千代田区,九段南"); p = new char*[3]; for(unsigned int i=0, j=0; i<strlen(buf); i++) { if(buf[i] == ',')p[j++] = &buf[i+1]; } for(int i=0; i<3; i++) { cout << selected[i] << "-" << p[i] << endl; } delete [] buf; delete [] p; } 結果は full-東京都,千代田区,九段南 nomal-千代田区,九段南 short-九段南 で、問題なさそうに見えるけど心配だから質問しました。 このソースに問題はないですか? 得に、 char **p; と p = new char*[3]; と p[j++] = &buf[i+1]; と delete [] buf; が心配です。
- ベストアンサー
- C・C++・C#
- 配列の中身のdelete
こんにちは 配列を使った際、うまいことDeleteが働いてくれないため メモリが開放されずに困っています、 初歩的な質問で申し訳ありませんが、質問させて下さい。 下記のプログラムでは、 単純にメモリ確保とメモリ開放を行っていると思うのですが… 注釈にもあるように、Deleteでメモリが開放されません。 #include <iostream> using namespace std; class Base { }; class Sub : public Base { char size[256];//領域確保用 }; void main() { Base* obj[10000]; for(int cnt=0;cnt<10000;cnt++) { obj[cnt] = new Sub; } for(int cnt=0;cnt<10000;cnt++) { delete obj[cnt];//メモリが開放されない } } ポインタが怪しいと思うのですが、 どうにかうまいことメモリを開放することは出来ないでしょうか。 よろしければ返答お願いいたします。
- ベストアンサー
- C・C++・C#
- メモリ操作関数『malloc(),free()』
/*10バイトのメモリ領域を確保し、その領域に文字列"Allocate"を代入せよ。*/ /*ただし、確保した領域は、プログラム終了までに開放すること。*/ #include<stdio.h> #include<stdlib.h> void main(void) { char *ptr; ptr = (char *)malloc(10); printf("Allocate\n"); free(ptr); } 今、ライブラリ関数を勉強しています。 この問題をとりあえず作ってみて、実行も成功したのですが、10バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。
- ベストアンサー
- C・C++・C#
- int *a = new int; エラー
下記をコンパイルすると、'int' 型は 'int *' 型に変換できない(関数 main() ) とエラーが出てしまいました。 何がおかしいのでしょうか ? 初歩的な間違いをしていると思いますが、アドバイスお願いします。 #include<iostream> #include<stdlib> #include<ctime> using namespace std; void main(void) { int *a = new int; a=rand(); cout<<a<<endl; delete a; }
- ベストアンサー
- C・C++・C#
- C++ の new演算子について
C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。
- ベストアンサー
- C・C++・C#