- ベストアンサー
c言語のスタック領域の使われ方について
- c言語でのスタック領域の使われ方について質問です。
- メイン関数やサブ関数のスタックへのプッシュとポップの順序を教えてください。
- 具体的なコード例を挙げながら教えていただけると助かります。
- みんなの回答 (7)
- 専門家の回答
関連するQ&A
- c言語 スタックの標準入力の課題です
c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }
- ベストアンサー
- C・C++・C#
- H8マイコン スタック領域について
スタック領域について教えて下さい。 [動作環境] 開発環境:ルネサス HEW Version 4.08 マイコン:ルネサス H8/1653 コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00 HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200 が自動で生成されると思います。 しかし、入手したH8/1653用のサンプルには #pragma stacksize のような サイズ指定がありませんでした。 [サンプル] (1)セクション定義やスタック領域のサイズ指定が無い (2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが サイズの設定が無い。 -- サブコマンドファイル(xxxx.sub)-- START CStart/00000000; START P,C,D/00000400; START B,R/00FF2000; START S/00FFC000; [質問] 質問1 (1)のスタック領域はどこに配置されるのでしょうか? 質問2 (2)のスタック領域は 00FFC000 を基準にどう確保 されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保? 00F00000 (a) ↑ 00FFC000 (設定アドレス) ↓ 00FFFFFF (b) 質問3 (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。 これらは指定しなくても問題ないものなのでしょうか? また、熟練者の方は指定しないものなのでしょうか? よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- スタックモジュール
「スタックモジュール」を作ることを考える。データ構造の定義と、以下の操作の定義を書け。ただしC言語を使え。 create 空のスタックを作る push スタックにデータを一つ挿入 pop スタックトップのデータを返すとともに、そのデータをスタックから削除 という問題です。 私は、C言語でのスタック構造は配列でしか扱ったことがなく、「スタックモジュール」の意味がよくわかりません。スタック構造はFILOのデータ構造ですが、これをC言語で書こうとすると配列を宣言して終わってしまう気がします。 create・push・popは、int (&num){......}のように普通に関数を宣言すればよいのでしょうか。 どなたか教えてください。
- ベストアンサー
- C・C++・C#
- VBAエラー「スタック領域が不足しています」
C2とD2のセルに英文字を入力した時,先頭文字を大文字にするVBAを組んだのですが,いざ実行すると「スタック領域が不足しています」と出てしまいます。以下にコードを示します。 'Sheet1 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 2 And Target.Column = 3 Then Range("C2").Value = StrConv(Range("C2").Value, vbProperCase) End If If Target.Row = 2 And Target.Column = 4 Then Range("D2").Value = StrConv(Range("D2").Value, vbProperCase) End If End Sub なぜこのようなエラーが出るのでしょうか。考えれば考えるほど合っているように思えて仕方なくなったので,ミスがあればご指摘をおねがいします。
- ベストアンサー
- Visual Basic
- プログラム領域の算出方法
現在C言語でプログラミングの勉強(設計含む)をしているのですが、設計書の記載項目に「プログラム領域」「ヒープ領域」「スタック領域」の算出を関数ごとに行うというような記述がありました。 動的メモリ領域・スタック領域の算出方法は何とか調べたのですが、「プログラム領域」の算出方法がわかりません! 出来れば 1.プログラム全体のプログラム領域の算出方法 2.関数ごとのプログラム領域の算出方法 を教えて頂けないでしょうか? 勉強している環境 OS:WindowsXP コンパイラ:Borland C++ Compiler 5.5 よろしくお願い致します。
- 締切済み
- C・C++・C#
- C言語・スタックを使用した逆ポーランド記法について
C言語でスタック(リスト構造)を使用した逆ポーランド記法のプログラムを作りたいのですが 計算式(例:1234+*+)が入力された場合、どのようにして数字と演算子を区別すればいいのでしょうか? 一応スタック構造の部分は、 #include <stdio.h> #include <stdlib.h> /*スタック構造*/ typedef struct stack { int max; int ptr; int *stk; } Stack; /*スタックの確保・初期化*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; return (-1); } s->max = max; return (0); } /*スタック解放*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*プッシュ*/ int StackPush(Stack *s, int x) { if (s->ptr >= s->max) return (-1); s->stk[s->ptr++] = x; return (0); } /*ポップ*/ int StackPop(Stack *s, int *x) { if (s->ptr <= 0) return (-1); *x = s->stk[--s->ptr]; return (0); } /*データのピーク*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*スタックの大きさを返却*/ int StackSize(const Stack *s) { return (s->max); } /*データを返却*/ int StackNo(const Stack *s) { return (s->ptr); } /*スタックは空か*/ int StackEmpty(const Stack *s) { return (s->ptr <= 0); } /*スタックは満杯か*/ int StackFull(const Stack *s) { return (s->ptr >= s->max); } /*スタックを空にする*/ void StackClear(Stack *s) { s->ptr = 0; } といった感じで仕上げています。
- ベストアンサー
- C・C++・C#
- C/C++言語のメモリについて
C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。
- ベストアンサー
- C・C++・C#
- c言語プログラミングでの質問?です。
学校でc言語プログラミングを使って簡単なゲームを作りなさい。 という課題が出ました。 下記の条件に沿って作れとのことです。 なかなかいいアイデアが浮かばないんですが、なにかちょうどいいものないですかね? ・scanf文を使うこと。。 ・if文を使うこと。 ・for文(while文)を使うこと。 ・rand関数を使うこと。 ・自分で定義した関数を使うこと。 ・配列または文字列を使うこと。
- ベストアンサー
- C・C++・C#
- C言語 if文でscanf関数
C言語のif文でscanf関数を使って、~と入力されたら・・・(~は文字列)のようなプログラムを作りたいです。どうすれば良いでしょうか?(簡単にお願いします・・・)
- ベストアンサー
- C・C++・C#
- C言語のメモリ領域確保
ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。。 >>スコープの関係です。 >>「int y」はif文の{}の中で宣言されている為、{}内でしか使用できません。 "variableの存在範囲外でそれを使おうとしただけ”であって、 別にpopされたから使えないというわけではないんですね。 とても助かりました。 それと、質問の内容がとても初歩的でかつ勘違いしたものになっていて、 本当に申し訳ないです。。 それでも、一応、私が知りたかったことは理解できたので、 回答してくださった皆さん本当にありがとうございます。