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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

2163閲覧

Run-Time Check Failure #2 C++

mmmw

総合スコア23

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2019/10/24 07:40

編集2019/10/24 09:00

前提・実現したいこと

visual C++ でソケット通信プログラムを作成中
// Packetの送信(SOCKET, Buffer, Datasize, 送信方法)にて
send_buf1[256] に pPno[5] を入れたところ,エラーメッセージが発生
send_buf1[256] に pPno[5] の値を格納したい

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

Run-Time Check Failure #2 - Stack around the variable 'send_buf1'was corrupted.

該当のソースコード

C++

1VOID DisplayFrame( PBYTE pBuf, DWORD dwSize ) 2{ 3 //TCP 4 5 char server_ip_addr[32]; 6 7 int port_number; 8 9 10 11 // Windows Sockets仕様に関する情報を格納する構造体 12 13 WSADATA wsa_data; 14 15 // WinSockの初期化処理(Version 2.0) 16 17 if (WSAStartup(MAKEWORD(2, 0), &wsa_data) != 0) { 18 19 std::cerr << "Winsockの初期化失敗(WSAStartup)" << std::endl; 20 21 } 22 23 24 25 // ユーザ入力 26 27 std::cout << "接続先IPアドレスを入力してください(xxx.xxx.xxx.xxx)" << std::endl; 28 29 std::cin >> server_ip_addr; 30 31 std::cout << "ポート番号を入力してください" << std::endl; 32 33 std::cin >> port_number; 34 35 36 37 // sockaddr_in構造体の作成とポート番号、IPタイプの入力 38 39 struct sockaddr_in dst_addr; 40 41 memset(&dst_addr, 0, sizeof(dst_addr)); 42 43 dst_addr.sin_port = htons(port_number); // ポート番号 44 45 dst_addr.sin_family = AF_INET; // AF_INETはipv4を示す 46 47 48 49 // 引数は (1) Type(ipv4 or v6) (2) IPアドレスのテキスト形式 (3) IPアドレスのバイナリ形式【(2)→(3)に変換】 50 51 inet_pton(dst_addr.sin_family, server_ip_addr, &dst_addr.sin_addr.s_addr); 52 53 54 55 // AF_INETはipv4のIPプロトコル & SOCK_STREAMはTCPプロトコル 56 57 int dst_socket = socket(AF_INET, SOCK_STREAM, 0); 58 59 60 61 // 接続処理 62 63 if (connect(dst_socket, (struct sockaddr *) &dst_addr, sizeof(dst_addr))) { 64 65 std::cerr << "接続失敗(サーバIPアドレス" << server_ip_addr << "/接続先ポート番号" << port_number << std::endl; 66 67 exit(0); 68 69 } 70 71 72 73 std::cout << "接続完了(サーバIPアドレス" << server_ip_addr << "/接続先ポート番号" << port_number << std::endl << std::endl;; 74 75 76 77 78 79 char send_buf1[256]; 80 81 char recv_buf[256]; 82 83 84 85 86 87 TCHAR szFrame[200]; 88 DWORD i = 0; 89 90 while ( i<dwSize) 91 { 92 BYTE ucSensor = pBuf[i+2]; 93 SHORT shSize = pBuf[i+6]; 94 95 // skip rest of header 96 i += 8; 97 98 PDWORD pFC = (PDWORD)(&pBuf[i]); 99 PFLOAT pPno = (PFLOAT)(&pBuf[i+4]); 100 101 _sntprintf( szFrame, _countof(szFrame), _T("%2d %d %+011.6f %+011.6f %+011.6f %+011.6f %+011.6f %+011.6ff\r"), 102 ucSensor, *pFC, pPno[0], pPno[1], pPno[2], pPno[3], pPno[4], pPno[5] ); 103 tstring sF = tstring(szFrame); 104 if (g_bScroll) 105 sF += tstring(_T("\n")); 106 107 108 109 //TCP 110 111 // Packetの送信(SOCKET, Buffer, Datasize, 送信方法) 112 send_buf1[256] = pPno[5]; 113 114 send(dst_socket, send_buf1, 256, 0); 115 116 // Packetの受信 117 118 recv(dst_socket, recv_buf, 256, 0); 119 120 121 122 AddMsg( sF ); 123 124 i += shSize; 125 } 126 127 // 解放処理 128 129 closesocket(dst_socket); 130 131 132 133 // WinSockの終了処理 134 135 WSACleanup(); 136}

試したこと

FLOAT型からconst char型への変換などを試したが上手くいかなかった

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

visual studio 2017

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

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

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

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

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

y_waiwai

2019/10/24 07:42

で、しつもんはなんでしょうか 質問は編集できるんで、追記修正しましょう
mmmw

2019/10/24 08:04

ありがとうございます。 追記修正いたしました。
y_waiwai

2019/10/24 08:41

提示されたコードには send_buf1の定義がありません。 コード全体を提示しましょう
mmmw

2019/10/24 09:00

すいません。コード全体を提示しなおしました
guest

回答1

0

ベストアンサー

char send_buf1[256];

と定義すると、アクセス可能範囲は
send_buf1[0] ~ send_buf1[255] までです。
send_buf1[256]は、アクセス範囲外となってエラーですね

send_buf1[256]にどーしても置きたいなら、定義のところで要素数を257以上にしましょう

投稿2019/10/24 09:04

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問