2017-02-22 7 views
2

私はこのコードなぜこのCコードは文字列を変更せず、バッファオーバーフローを引き起こしますか?

#include <stdio.h> 

int main() 
{ 
    char String[] = "Hello the world!"; 
    char *pointer = String; 
    int i; 

    printf(" %s\n", pointer); 

    pointer = "Helllooooo the worlldddddd"; 
    printf("Hello %s\n", pointer); 
    printf("Hello %s\n", String); 

    return 0; 
} 

を書いたが、私はこの行が正常に動作方法を理解することはできません。

pointer = "Helllooooo the worlldddddd"; 

いますが、それはString値を変更することができませんでしたが、それは文字の元の数よりも多くを示して見ての通り、私は、この出力

Hello the world! 
Hello Helllooooo the worlldddddd 
Hello Hello the world! 

を得ました。これはバッファオーバーフローを引き起こすべきではありませんか?それは他の変数を破壊しないだろうか?あなたが行

pointer="Helllooooo the worlldddddd"; 

を書くとき

+1

'「こんにちは、世界!」'と '「Helllooooo worlldddddd」'メモリの2つの異なる部分にある2つの異なる文字列が、あります。ポインタ 'と= ...'、あなたが(その文字列を指すように設定する、すなわち)これらの文字列のいずれかのアドレスに 'pointer'を設定しています。 –

答えて

6

あなたは「配列はpointerによって指し示さ取り、文字列"Helllooooo the worlldddddd"とその内容を上書きする」というのではなく、「そうでた文字列pointerポイントを変更していません現在は文字列""Helllooooo the worlldddddd"を指していることを示しています。これは、あなたが直接実際に修正したことがないStringを直接印刷したときに元の文字列が印刷されている理由を説明しています。その結果、実際に何も書いていないので、ここで配列のオーバーフローを心配する必要はありません。あなたは

を書いた場合、実際に はバッファに新しい文字列の内容をコピーしない
strcpy(pointer, "Helllooooo the worlldddddd"); 

pointerが指す

一方、あなたは、バッファオーバーフローを持っているでしょう問題になるだろう。しかし、これは "このポインタが指している場所を変更する"ではなく、 "この文字列の内容をこの場所にコピーしてください"という明示的な操作とは非常に異なることに注意してください。

+1

@JohnHは - より多くのスペースがSTRING' 'に追加することができないもののので、私は信じていません' STRING'は 'のrealloc(...)'と例えば、それを修正することができ、暗黙的またはそれ以外の場合は、 'const'と考えられています。暗黙の 'const'だった場合は、実行時エラーではなくコンパイル時エラーが発生すると思います。あなたがそうでなければ観察した特定の環境はありますか? – ryyker

+1

@JohnH、何の 'STRING'は変更可能である必要があります。これは文字列リテラルを指しているのではなく、 'const'修飾されていない' char'の完全に別の配列です。だからそれ自体はそれを変更することに問題はありません。 (しかし、サイズには明らかに問題があります。) –

1

これまでのところ、文字列「Hello world」を指すポインタを初期化しました。char *pointer=String;
first printf printf(" %s\n",pointer);、 "Hello world"を指すポインタを印刷しました。
新しい文字列 "Hellloooooo the worllddddd"を指すポインタを設定しますpointer="Helllooooo the worlldddddd";
この場合、ポインタは "Hellloooooo the worllddddd" printf("Hello %s\n",pointer);に印刷されています。
最後にprintf文字列 "Hello world" printf("Hello %s\n",String);を印刷しました。
注:。文字列を操作する際に考慮するために

1

つ以上quickオプション (ポインタまたは文字列)の値の前に印刷されます、あなたがprintf("Hello %s\n",String);第二と第三のprintf printf("Hello %s\n",String);文字列ハローに印刷されている(takecare):
文字列関数strdup(...);を使用すると、簡単に既存の文字列を新しく作成した文字列にコピーすることができます。(すべての複雑さが抽象化されたか、少なくとも一つ)

char *pointer = strdup("Helllooooo the worlldddddd"); 

新しい文字列pointer今のように定義されてlen長いlenに任意の文字列を格納するために使用することができます。

例えば
int len = strlen(pointer);//len is 26 after using strdup(...); above 

だから、あなたの例の文字列がlenよりも短いので:

char String[]="Hello the world!";//length is 16 

あなたは、バッファオーバーフローなしpointerにそれをコピーすることができます:strdup(...):使用して作成した

strcpy(pointer, String); 

文字列はメモリリークを避けるためにfree'dする必要があります。

free(pointer); 
1
#include <stdio.h> 

int main() 
{ 
char String[]="Hello the world"; // the string 
char *pointer=String;    // pointer to string 
char i;       //counter 

printf(" %s\n",pointer);   // print current value of pointer 

pointer="number of char";   // new value to replace the string 
for (i=0;i<14;i++)    // you cannot change the content of array without using loop 
{ 
String[i] = pointer[i];   // char i in string = ti char i in pointer 
} 
printf("Hello %s\n",pointer); // print value of pointer 
printf("Hello %s\n",String); // print value of string 

return 0; 
} 

私は何をやろうとしていることを考える:あなたはpointerの使用を終了するときは、次を呼び出します。

関連する問題