[解決済み] スタックアロケーションで未初期化の値が作成されました。
2022-02-15 15:43:06
質問
int main(){
char *input = NULL;
char *line[2048];
size_t inputChars = 0;
size_t bufferSize = 0;
char *command = NULL;
char *arguments[2048];
printf(":");
fflush(stdout);
while((inputChars = getline(&input , &bufferSize , stdin)) > 0){
memset(line, '\0' , (sizeof *line * sizeof line[0]) );
memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]));
if(inputChars == -1){
clearerr(stdin);
}
else{
parseLine(input,line);
command = line[0];
int i = 0;
int j = 1;
while(line[j] != NULL)
{
arguments[i] = line[j];
i++;
j++;
}
if((*line[0] != '#') && (*line[0] != '\n'))
{
runCommand(command,arguments);
}
printf(":");
fflush(stdout);
}
input = NULL;
}
}
int isBackground(char* args[])
{
int i = 0;
int pos = 0;
while (args[i] != NULL)
{
pos++;
i++;
}
if (*args[pos - 1] == '&')
{
background++;
return true;
}
else return false;
}
void runCommand(char* cmd, char* args[])
{
printCommandLine(cmd, args);
if (isBackground(args))
{
printf("Background Processes: %i\n",background);
}
}
void printCommandLine(char* cmd, char* args[])
{
printf("Command: %s\n",cmd);
printf("Arguments:\n");
int i = 0;
while (args[i] != NULL)
{
printf("%s\n",args[i]);
i++;
}
}
ヴァリグリンの結果
xcodeの出力です。
どこで間違っているのかわかりません。私は、引数のリストを持つコマンドを受け入れることができるコマンドラインのためのいくつかの簡単なコードを書いています。プログラムは、長さ <= 7 の文字列配列に対して正常に動作し、このサイズのコマンドの最初の入力の後は、すべてのコマンド配列に対して動作します。どこで初期化されていない値を使用しているのかがわかりません。コードが壊れると、引数配列をループするときに不正なアクセスが発生します。私はそれが引数配列を埋めるmainのwhileループに関係しているかもしれないと思うが、私は間違っているかもしれない。本当に困っています。何かアイデアがあれば、あなたの助けやアドバイスをありがとうございました。
解決するには?
memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]))
これは、初期化されていない値を引き起こすあなたのコードの問題です。
*arguments
と同じです。
arguments[0]
. そして
sizeof
はどちらも
sizeof(char*)
.
つまり、バッファの中のいくつかのエントリだけを初期化していることになります。
必要なのは
memset(arguments, '\0', sizeof(arguments));
前の行も同様
memset(line, '\0', sizeof(line));
関連
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】execvp: バッドアドレスエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】警告:式の結果が未使用の場合