私はCのコースを読んでいます(それはおそらくあなたが知らないでしょう)。文字列の動作を理解するための小さな練習があります。そのため私はエクササイズを開始するための小さなCプログラムを作成しましたが、私のプログラムの最初の出力は(私にとって)驚くべきものです。Cの文字列の動作
私のCプログラムのソース:
#include <string.h>
#include <stdio.h>
void printString(char *string)
{
printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n");
printf("%c ",string[0]);
printf("%c ",string[1]);
printf("%c ",string[2]);
printf("%c ",string[3]);
printf("%c ",string[4]);
printf("%c ",string[5]);
printf("%c ",string[6]);
printf("%c ",string[7]);
printf("%c ",string[8]);
printf("%c ",string[9]);
printf("%c ",string[10]);
printf("%c ",string[11]);
printf("%c ",string[12]);
printf("%c ",string[13]);
printf("%c ",string[14]);
printf("%c ",string[15]);
printf("%c ",string[16]);
printf("%d ",string[17]);
printf("%d ",string[18]);
printf("%d\n",string[19]);
}
void main(){
char str[20];
strcpy(str,"Dag grootmoeder!");
printString(str);
}
Iのgcc(特別なスイッチ)でコンパイルされたプログラムを実行したいくつかの回: (英語を話す人Dag grootmoeder! == Hi grandma!
用)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 94 -90 111
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 51 -12 96
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! -17 -117 28
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 96 15 -28
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! -20 -46 -18
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 68 -75 58
1)strの最後の3つのインデックスのゴミ値を取得するのはなぜですか?最初はprintf()
で、%c
と入力し、文字が変更されていることに気がついたので、それ以降は整数値を表示するために%d
を使用しました。
2)これらの値はなぜ変わるのですか?私は何もしないで、同じ文字列をstrcpy()
をstrにコピーします。
返信するには時間がかかり、応答した人にはさらに高価なThx!
ジョーン
*私は実際にメモリを見ていると思ったが、char str [20]の初期化で20バイトを予約している。 (または私は仮定する)。 予約されている20バイトの未使用メモリを埋めるのにいくつかのメモリ最適化はありますか? –
thx、スタック無作為化を無効にしたときに気付いたこれらの値は同じままです。 "0">/proc/sys/kernel/randomize_va_space –
@JornDePrilあなたの配列を初期化しない場合、あなたのサイドノートについて – cnicutar