2016-09-12 10 views
0

文字配列に格納された2つの文字列を交換するための1.Cコード。文字配列に格納された2つの文字列を交換するC

#include<stdio.h> 

/* Swaps strings by swapping pointers */ 
void swap1(char **str1_ptr, char **str2_ptr) 
{ 
    char *temp = *str1_ptr; 
    *str1_ptr = *str2_ptr; 
    *str2_ptr = temp; 
} 

int main() 
{ 
    char str1[10] = "geeks"; 
    char str2[10] = "forgeeks"; 
    swap1(&str1, &str2); 
    printf("str1 is %s, str2 is %s", str1, str2); 
    getchar(); 
    return 0; 
} 

読み取り専用メモリに格納された2つの文字列を交換するための2.Cコード。

#include<stdio.h> 

/* Swaps strings by swapping pointers */ 
void swap1(char **str1_ptr, char **str2_ptr) 
{ 
    char *temp = *str1_ptr; 
    *str1_ptr = *str2_ptr; 
    *str2_ptr = temp; 
} 


int main() 
{ 
    char *str1 = "geeks"; 
    char *str2 = "forgeeks"; 
    swap1(&str1, &str2); 
    printf("str1 is %s, str2 is %s", str1, str2); 
    getchar(); 
    return 0; 
} 

これら二つは二つの文字列(読み取り専用メモリ内の他のスタックに格納された1つの文字列など)をスワップするためのコードです。 同じように動作しますか? 最初のコードは正しく動作しないと言われています。 もしそうなら、なぜですか?

+1

'最初のコードは配列を使用しているため、ポインタには崩壊する可能性がありますが、ポインタではありません。 – LPs

+4

あなたのタイトルはミッドリーディングです。あなたは "文字列"(別名配列内容)を交換するのではなく、ポインタを交換します。そして、Cはスタックの使用を強制したり、変数が格納されている場所を定義したりしません。 – Olaf

+1

@Gerhard:いいえ、彼らはしません! – Olaf

答えて

4

swap1関数の呼び出しでポインタへのポインタを実際に渡していないため、最初の例は機能しません。ポインタを配列に渡しています。

&str1のタイプがchar**でない場合は、char (*)[10]です。それは非常に大きな違いであり、それらのポインタを参照解除してスワップしようとすると、あらゆる種類の問題が発生します。

関連する問題