2016-12-28 17 views
-1

私にはわからない問題があります。ポインタが時々nullである理由を私は理解できない変数宣言の代わりにconstを使用したヌルポインタ

azlngiwexbv(null)uscphqjyrodmtk 

と私:私はプログラムを実行すると、これはiutputある

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

const char *array[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 

int main(int argc, char **argv) 
{ 
int i, tmp, randomize, size; 

size = sizeof(array)/sizeof(*array); 

srand(time(NULL)); 

for(i=size;i>0;i--){ 
    randomize=0+(rand()%size); 
    tmp=(int)array[i]; 
    array[i]=array[randomize]; 
    array[randomize]=(char*)tmp; 
} 

for(i=0;i<size;i++) 
    printf("%s", array[i]); 
    return 0; 
} 

:私は、配列の要素をシャッフルするために、このコードを書きましたなぜこのようにソースコードを変更するのか理解できません:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(int argc, char **argv) 
{ 
char *array[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 
int i, tmp, randomize, size; 

size = sizeof(array)/sizeof(*array); 

srand(time(NULL)); 

for(i=size;i>0;i--){ 
    randomize=0+(rand()%size); 
    tmp=(int)array[i]; 
    array[i]=array[randomize]; 
    array[randomize]=(char*)tmp; 
} 

for(i=0;i<size;i++) 
    printf("%s", array[i]);  
return 0; 
} 

すべてがうまくいきます。おかげさまで

+2

'tmp =(int)array [i];' ...なぜですか? –

+0

この警告を回避するには: –

+0

警告:割り当ては、キャストのないポインタから整数を生成します。[-Wint変換] tmp = array [i]; ^ –

答えて

3

開始ループsize-1から、array[size](最初のループ反復)の配列を指しています。

for (i=size-1; i>=0; i--) 
+0

配列の外、null charの出力を説明するヌル終端文字を選択する –

+1

@ Jean-FrançoisFabreいいえ、まったくありません。'array'がヌルで終わっていても(それはそうではありません)、nullはその境界内にあります。これは単にUBです。 – Quentin

+0

pbn、あなたの提案は、ありがとうございます。しかし、私はまだ理解していない理由は、主な関数で変数char *配列を宣言すると、プログラムは動作します: - \ –

0

キャスティングはできるだけ避けてください。キャスティングを避ける必要はほとんどありません。

argcargv[]を使用する予定がない場合は、main()の簡単なフォーム:int main(void)を使用してください。これにより、いくつかのコンパイラの警告が削除されます。これらを有効にする必要があります。 すべてコンパイラが警告を発します。

あなたはtmpに保存するintcharへのポインタをキャストし、その後、あなたが戻っ(char *)からtmpをキャスト。最初にcharへのポインタとしてtmpを宣言してください。最初のループはsizeから0にカウントダウンします。これは配列の範囲外ですが、なぜ従来のループ構造を使用しないのですか?for (i = 0; i < size; i++)?また、配列インデックスにはsize_tを使用することを検討する必要があります。任意の配列インデックスを保持できることが保証された符号なし整数型であり、演算子sizeofによって返される型でもあります。

さらに、最初のバージョンではarrayconst charへのポインタの配列として宣言されています。これを行うことができますが、修飾子タイプconstに同意するには、一時ストレージ変数tmpが必要です。

上記の変更を加えたコードは次のとおりです。キャストはなく、警告なしでコンパイルされ、動作します。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) 
{ 
    const char *array[] = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}; 

    const char *tmp; 
    size_t i, size; 
    int randomize; 

    size = sizeof(array)/sizeof(*array); 

    srand(time(NULL)); 

    for(i = 0; i < size; i++){ 
     randomize = (rand() % size); 
     tmp = array[i]; 
     array[i] = array[randomize]; 
     array[randomize] = tmp; 
    } 

    for(i = 0; i < size; i++) 
     printf("%s", array[i]); 
    putchar('\n'); 

    return 0; 
} 
関連する問題