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

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

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

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

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

1回答

1348閲覧

VScodeでC言語を実行すると「'hello' accessing 1024 bytes in a region of size 7 [-Wstringop-overflow=]」が表示される

iq180

総合スコア3

C

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

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2022/09/05 14:01

編集2022/09/05 14:09

前提

C言語をVScodeを利用して勉強しています。
利用OSはWindows 11 64bitです。

以下に記す該当のソースコードを実行すると[出力]は正常ですが、[問題]の項目にエラーメッセージが表示されました。

実現したいこと

  • 問題の項目のエラーが表示されないようにしたい

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

'hello' accessing 1024 bytes in a region of size 7 [-Wstringop-overflow=]

イメージ説明

該当のソースコード

C言語

1#include <stdio.h> 2 3typedef char String[1024]; 4 5void hello(String name) { 6 printf("%sさん、こんにちは\n", name); 7} 8 9int main(void) { 10 hello("田中"); 11 return 0; 12}

試したこと

”田中”の文字を"t"に変更した場合、エラーメッセージの7が2に変わりました。

typedef char String[1024]をtypdef char String[64]に変更するとエラーメッセージの1024が64に変わりました。

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

★インストール済みの拡張機能
イメージ説明

c_cpp_properties.json

1{ 2 "configurations": [ 3 { 4 "name": "MinGW", 5 "includePath": [ 6 "${workspaceFolder}/**", 7 "C:\\gcc\\mingw64\\include" 8 ], 9 "defines": [ 10 "_DEBUG", 11 "UNICODE", 12 "_UNICODE" 13 ], 14 "windowsSdkVersion": "10.0.22000.0", 15 "compilerPath": "C:/gcc/mingw64/bin/gcc.exe", 16 "cStandard": "c17", 17 "cppStandard": "c++17", 18 "intelliSenseMode": "windows-gcc-x64" 19 } 20 ], 21 "version": 4 22}

launch.json

1{ 2 "configurations": [ 3 { 4 "name": "C/C++: gcc.exe アクティブ ファイルのビルドとデバッグ", 5 "type": "cppdbg", 6 "request": "launch", 7 "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", 8 "args": [], 9 "stopAtEntry": false, 10 "cwd": "${fileDirname}", 11 "environment": [], 12 "externalConsole": false, 13 "MIMode": "gdb", 14 "miDebuggerPath": "C:\\gcc\\mingw64\\bin\\gdb.exe", 15 "setupCommands": [ 16 { 17 "description": "gdb の再フォーマットを有効にする", 18 "text": "-enable-pretty-printing", 19 "ignoreFailures": true 20 }, 21 { 22 "description": "逆アセンブリ フレーバーを Intel に設定", 23 "text": "-gdb-set disassembly-flavor intel", 24 "ignoreFailures": true 25 } 26 ], 27 "preLaunchTask": "C/C++: gcc.exe アクティブなファイルのビルド" 28 }, 29 ], 30 "version": "2.0.0" 31}

tasks.json

1{ 2 "tasks": [ 3 { 4 "type": "cppbuild", 5 "label": "C/C++: gcc.exe アクティブなファイルのビルド", 6 "command": "C:\\gcc\\mingw64\\bin\\gcc.exe", 7 "args": [ 8 "-fdiagnostics-color=always", 9 "-g", 10 "${file}", 11 "-o", 12 "${fileDirname}\\${fileBasenameNoExtension}.exe" 13 ], 14 "options": { 15 "cwd": "${fileDirname}" 16 }, 17 "problemMatcher": [ 18 "$gcc" 19 ], 20 "group": { 21 "kind": "build", 22 "isDefault": true 23 }, 24 "detail": "デバッガーによって生成されたタスク。" 25 } 26 ], 27 "version": "2.0.0" 28}

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数 hello() がサイズ1024のchar配列を引数として要求しているのに、サイズ1024無い文字列定数を渡しているので危険に見えるということです。

処理内容によりますが、この hello() の実装なら、hello() の引数は const char* にすべきでしょう。
または、main()String型の変数を文字列定数で初期化してからhello() に渡しましょう。

投稿2022/09/05 14:08

int32_t

総合スコア20777

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

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

int32_t

2022/09/05 14:26

間違ってはないですが、「引数は const char* に」か「 String型の変数を文字列定数で初期化してからhello() に渡し」のどちらかだけでいいです。
iq180

2022/09/05 14:48

追加でご回答ありがとうございます。 「引数はconst char*に」の変更は以下のようにすると上手くいきました。 ‘‘‘ #include <stdio.h> //typedef char String[1024]; void hello(const char* name) { printf("%sさん、こんにちは\n", name); } int main(void) { hello("田中"); return 0; } ‘‘‘ しかし「 String型の変数を文字列定数で初期化してからhello() に渡し」の方法はわかりませんでした。
iq180

2022/09/05 15:02

VScodeを再起動して以下を試すとエラーが出ずに上手く動作しました! ‘‘‘ #include <stdio.h> typedef char String[1024]; void hello(String name) { printf("%sさん、こんにちは\n", name); } int main (void) { String name = "田中"; hello(name); return 0; } ‘‘‘ 再起動しなければうまくいかなかった理由は不明です。 ご回答いただきありがとうございました!
y_waiwai

2022/09/05 23:37

> typedef char String[1024]; なにかで聞きかじってこういうことしてるんでしょうけど、初心者のうちはこういう余計なことはしないほうがよろしいかと。 言語の文法を学ぶ上でいいことはありません
iq180

2022/09/06 09:53

>なにかで聞きかじってこういうことしてるんでしょうけど、 まさにその通りで、2021年12月11日 初版発行の「ス〇キリわかるC言語入門 第2版」に、実際にプログラムの一例例として記載されていた内容をそのまま写経して実行したところエラーがでたために質問したんですよね。 C言語の初学者であるため、今の私にはこれがどんな時にどういう理由から余計なことになるのか理解できないでいます。
iq180

2022/09/13 03:39

あれから本書を読み進めていくことでC言語にいわゆるString型が存在せず、あくまで「入門をスムーズに進めるための苦肉の策であった」ということを理解できました。 本書のやり方が最も良い方法であったのかはわかりかねますが、ポインタの理解が進んだ現在では本書の方針に感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問