- 締切済み
GUIアプリケーションで連続領域がとれません。
taka_tetsuの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
リリースモードでビルドしてもですか? あと自分でスタートアップルーチンを自分で見てみてはいかがでしょうか? VC6++でしたらCRT0.Cです。ソースついてるんですから疑う前に確認しましょう。 あとは、それでも上手くいかないようでしたらスタートアップルーチン自分で空のを書いちゃえばいいかと。ランタイム関数は使えなくなるんでメモリ確保はHeapAlloc()とかになりますが。
関連するQ&A
- 文字型配列の有効期間
char 型配列の有効期間について教えてください。 例えば、 char* p=(char*)malloc(sizeof(char)*10) などで、動的に配列を確保した場合、必ずfree()で、 開放する必要があると思うのですが、 char[]="Hello"; char* p; p=char; p=null; char=null; とした場合、pとcharが指していた”Hello"の領域は 自動的に開放されるのでしょうか?また、開放される としたらそれは、pおよびcharにnull が代入された 時点でしょうか? どうぞよろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- メモリ確保エラー時の効率的な書き方
mallocなどで複数の変数に対してメモリを確保する場合があると思います.例えば3つの変数の場合, char *a, *b, *c; a = (char *)malloc(100); if(a==NULL){ /* メモリ確保できなかったとき */ return (-1); } b = (char *)malloc(100); if(b==NULL){ free(a); return (-1); } c = (char *)malloc(100); if(c==NULL){ free(a); free(b); return (-1); } 変数が多くなるにつれて後から確保する変数のエラー処理(すでに確保したメモリのfree)が増えてしまうので,何か良い方法(コードが短くなるような)はないでしょうか?
- ベストアンサー
- C・C++・C#
- mallocでメモリーを確保しようとすると暴走します
組み込み系のプログラミングをやっているもので、malloc、freeを使って動的にメモリーの確保、開放を行っているのですが、途中で暴走してしまいます。 (mallocを呼び出すと、返ってこなくなります。) そこでmallocの動作を見ようと、以下のプログラムを作って動作させると、while文の中を一周はするのですが、2週目のp2のポインターの値が返ってきません。(malloc関数の中でloopしています。) /* 以下ソースコード */ char *p1; char *p2; char *p3; char *p4; while(1){ p1 = (char*)malloc(100); p2 = (char*)malloc(100); p3 = (char*)malloc(100); free(p3); p4 = (char*)malloc(100); free(p4); free(p2); free(p1); } ※メモリーは、2k確保していあるので、サイズがオーバーしているということはないと思います。 ご質問ですが、 ・上記ソースコードで暴走するような要因がありますでしょうか? ・malloc、free関数でメモリーの取得、開放の順番など注意しないといけないことがあるのでしょうか? ・malloc、free関数等を自作とかされていますでしょうか? どうぞよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- C言語 動的なメモリの確保 実行できない
malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) { int i; char *C; C = (char *) malloc (sizeof(char) * 5); C = "ABCD"; for(i = 0; i < 5; i++){ if(C[i] != NULL){ printf("%s", C[i]); ←※エラー※ } } free(C); return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?
- ベストアンサー
- C・C++・C#
- メモリ
メモリについてご質問します。 例えば char *p; p = (char *)malloc(100); とすればpに100バイトのメモリが割り当てられる・・ pに文字列を代入する場合100バイトまで格納可能である。 次にファイルからの一行のある部分の文字列を入れる場合 char *s; while(fgets(buf,1000,fp) !=NULL){ s = GetWord(・・)//何らかの文字列が返ってくる関数です とする場合このときのsについてもメモリを取得しなければなりません。 その際 s = (char *)malloc(100); while(/*省略*/){ とwhileの外でとるのか、それとも while(/*省略*/){ s = (char *)malloc(100); と中でとるべきなのかどっちでしょう? というのもwhile文の中でメモリを作成すると 1回ごとに新たなメモリをとっているのか 更新されていっているのかがわかりません。
- ベストアンサー
- C・C++・C#
- C言語の領域確保について
C言語を始めたばかりのものです。 配列を計算させようと下のようなプログラムを作り、一応動作はするのですが、配列の領域確保がいまいちわかりません。配列はcsvから値をとっています。確保する領域は、代入する値の数でいいので、buff[8×64]、とかarv[4×32]でいいと思い、それより少し大きな値くらいで実行すると失敗してしまいます。 自分の理解の仕方が間違っているとは思っているのですが、(char *)malloc(M*N*sizeof(char))でやっても失敗しました。どうすればよいかお教え願います。ちなみに、csvの値は0.000852354710804709のように桁が半端ないです。 またfgetsのライン数の値も正しくするにはどうすればよいのでしょうか。できたらmallocを使えたらよいと思っています。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 8 //8行 #define M 64 //64列 int main() { char *fname = "test.csv";//8行64列 char *ffname = "tk.csv";//4行32列 FILE *IN1, *IN2, *OUT1, *OUT2; char buff[100000];//←問題の部分 char *pbuff; char arv[400];//←問題の部分 char *parv; double a[N][M+30], b[N][M], c[N][M], w[4][32]; int i, j, x; double m, n; int count=0; if((IN1 = fopen(fname, "r")) == NULL){ printf("can't open the %s", fname); return 0; } if((IN2 = fopen(ffname, "r")) == NULL){ printf("can't open the %s", ffname); return 0; } i=j=0;//配列の取得 while(fgets(buff, 100000, IN1) != NULL){ pbuff = buff; while((pbuff = strtok(pbuff, ",\n")) != NULL){ a[i][j++] = strtod(pbuff, NULL); pbuff = NULL; } i++; j=0; } i=j=0;//配列の取得 while(fgets(arv, 400, IN2) != NULL){ parv = arv; while((parv = strtok(parv, ",\n")) != NULL){ w[i][j++] = strtod(parv, NULL); parv = NULL; } i++; j=0; } : : : このプログラムでも計算はできるのでいいのですが、最終的には500行2048列の計算をしないといけないので、いっそう数字が膨大となるために質問させていただきました。Visual Stdio 2010 c/c++ 使ってます。
- ベストアンサー
- C・C++・C#
- 動的なメモリ領域の確保
double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5 // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) { // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言 double * pointer; int i; // for文で使用する変数の宣言 // int型変数5個分のメモリ領域を確保 pointer = (double *)malloc(sizeof(double) * COUNT); if(pointer == NULL) { // メモリ領域の確保が失敗した場合 printf("メモリ領域を確保できませんでした.\n"); exit(1); // プログラムの終了 } for(i = 0; i < COUNT; i++) printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i); free(pointer); // 確保したメモリ領域の解放 return 0; }
- 締切済み
- 情報工学
- mallocとfree
struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。
- ベストアンサー
- C・C++・C#