質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1758閲覧

【C言語】スタック破壊エラーの解決法について

shiny0315

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/12/16 17:59

編集2021/12/17 01:53

前提・実現したいこと

C言語で通信の研究をしています。
ノードにデータを持たせてノード同士の距離が近いとお互いのデータを交換するというプログラムを作っています。

発生している問題・エラーメッセージ

最初はノードの数を5個で行いました。
7個目からエラーが出て正しく実行できません。

エラー内容
Run-Time Check Failure #2 - Stack around the variable 'NODE' was corrupted

該当のソースコード

#include<stdio.h> #include<math.h> #include<stdlib.h> #define NODEMAX 7 #define X_MAX 7 #define Y_MAX 7 #define DISTANCE 1 //ノードの構造体// struct node { int x; int y; int data[5]; int CT; }; //重複しない乱数を発生させる関数 void shuffle(int ary[]) { for (int i = 0; i < NODEMAX; i++) { int j = rand() % NODEMAX; int t = ary[i]; ary[i] = ary[j]; ary[j] = t; } } //ノードの移動範囲のパラメータ// int main(void) { //乱数SEED設定// srand((int)time(NULL)); int N; //ノードをフィールド上に生成 struct node NODE[NODEMAX]; for (N = 0; N < NODEMAX; N++) { NODE[N].x = rand() % X_MAX; NODE[N].y = rand() % Y_MAX; printf("ノード%d\n%d %d\n",N, NODE[N].x, NODE[N].y); } //0~1の乱数を生成したのち上下左右どちらかで移動// //0~0.25でx+1、0.25~0.5で左にx-1、0.5~0.75でy+1、0.75~1でy-1// int M; double ram; for (M = 0; M < NODEMAX; M++) { ram = (double)rand() / RAND_MAX; printf("乱数%lf\n", ram); if (ram <= 0.25) { if (NODE[M].x != X_MAX) { NODE[M].x += 1; } } else if (ram <= 0.5) { if (NODE[M].x != 0) { NODE[M].x -= 1; } } else if (ram <= 0.75) { if (NODE[M].y != Y_MAX) { NODE[M].y += 1; } } else { if (NODE[M].y != 0) { NODE[M].y -= 1; } } printf("ノード%d\n%d %d\n", M, NODE[M].x, NODE[M].y); } //ノードにデータを持たせる //フィールド全体でデータの箱を作る int FIELDDATA[NODEMAX]; for (int O = 0; O < NODEMAX; O++) { FIELDDATA[O] = 1; } //ノードのデータの初期化 for (int a = 0; a < NODEMAX; a++) { for (int b = 0; b < NODEMAX; b++) { NODE[a].data[b] = 0; } } //ランダムでノードにデータをいれる int list[NODEMAX] = {0,1,2,3,4,5,6}; //個数を変える shuffle(list, NODEMAX); for (int P = 0; P < NODEMAX; P++) { printf("%d\n", list[P]); NODE[P].data[list[P]] = 1; } for (int R = 0; R < NODEMAX; R++) { printf("ノード%d,%d%d%d%d%d\n", R, NODE[R].data[0], NODE[R].data[1], NODE[R].data[2], NODE[R].data[3], NODE[R].data[4]);//各ノードに追加されたデータを表示 } //0-1.2.3.4 for (int T = 1; T < NODEMAX; T++) { printf("ノード0と%d X=% d,Y=% d\n",T, abs(NODE[0].x - NODE[T].x) , abs(NODE[0].x - NODE[T].y) ); if (abs(NODE[0].x - NODE[T].x) <= DISTANCE && abs(NODE[0].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[0].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[0].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[0].data[S] = 2; } else if(NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //1-.2.3.4.5.6 for (int T = 2; T < NODEMAX; T++) { printf("ノード1と%d X=% d,Y=% d\n", T, abs(NODE[1].x - NODE[T].x), abs(NODE[1].x - NODE[T].y)); if (abs(NODE[1].x - NODE[T].x) <= DISTANCE && abs(NODE[1].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[1].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[1].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[1].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //2-3.4.5.6 for (int T = 2; T < NODEMAX; T++) { printf("ノード2と%d X=% d,Y=% d\n", T, abs(NODE[2].x - NODE[T].x), abs(NODE[2].x - NODE[T].y)); if (abs(NODE[2].x - NODE[T].x) <= DISTANCE && abs(NODE[2].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[2].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[2].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[2].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //3-4.5.6 for (int T = 3; T < NODEMAX; T++) { printf("ノード3と%d X=% d,Y=% d\n", T, abs(NODE[3].x - NODE[T].x), abs(NODE[3].x - NODE[T].y)); if (abs(NODE[3].x - NODE[T].x) <= DISTANCE && abs(NODE[3].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[3].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[3].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[3].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //以下の作業を6-7となるまで繰り返す。 for (int U = 0; U < NODEMAX; U++) { printf("ノード%d,%d%d%d%d%d\n", U, NODE[U].data[0], NODE[U].data[1], NODE[U].data[2], NODE[U].data[3], NODE[U].data[4]);//各ノードに追加されたデータを表示 } printf("新しく受け取ったデータを1→2にする\n"); for (int V = 0; V < NODEMAX; V++) { //新しく受け取ったデータを次のクールタイムで処理できるようにデータを2から1にする。 for (int X = 0; X < NODEMAX; X++) { if (NODE[V].data[X] == 2) { NODE[V].data[X] = 1; } } } for (int Y = 0; Y < NODEMAX; Y++) { printf("ノード%d,%d%d%d%d%d\n", Y, NODE[Y].data[0], NODE[Y].data[1], NODE[Y].data[2], NODE[Y].data[3], NODE[Y].data[4]); } return 0; }

試したこと

定義のところでNODEMAXを5から順番に1つずつ増やしたら7以上からエラーが出ました

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/12/16 21:16

エラーの原因とは別ですが(エラーの原因は既に出ている回答の箇所かと思います)、 VC++でコンパイルする際にいくつか警告が出ていたと思うので解消されることをお勧めします。 --------------------------- ・warning C4013: 関数 'time' は定義されていません。int 型の値を返す外部関数と見なします。 ⇒ time() を使用する際は time.h の #include が必要です。 ・warning C4020: 'shuffle': 実引数が多すぎます。 ⇒ 「shuffle(list, NODEMAX);」の第2引数が未使用です。 ---------------------------
episteme

2021/12/16 22:01

> エラーが出ました なにをしたら/どうなったのか を述べてください。
thkana

2021/12/16 22:32

タグ[C#]はどういう関係があるのでしょう? タグは、あなたの質問が回答者の関心を呼ぶためにあるのではなく、後々似たような状況に陥って情報を探している人が欲しい情報を絞り込むためのものです。C#の情報を探している人がこの投稿に行きあたったときどう感じるか、想像してみてください。
退会済みユーザー

退会済みユーザー

2021/12/16 23:23

C# は関係ないので C# のタグは外してください。C# のタグで見ている閲覧者にとってはこのスレッドはノイズにしかならず迷惑ですので。
guest

回答2

0

for (int b = 0; b < NODEMAX; b++) {

NODE[a].data[b] = 0; }

ここでメモリ破壊が起こってますね

投稿2021/12/16 23:02

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

dataの配列の個数をNODE_MAXにしないといけないかとおもいます。

C++

1struct node { 2 int x; 3 int y; 4 int data[NODE_MAX]; 5 int CT; 6};

投稿2021/12/16 21:02

Serbonis

総合スコア581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問