4

現在、2 つのベクトルの合計を計算する単純な関数を作成中です。私は C に慣れていないので、ベクトルに対していくつかの「擬似乱数」値を生成し、それらの長さをランダム化することも考えました。これは、この演習で必要以上のものです。

基本的に、コードを書き始めたばかりで、配列の値がどうなるかを確認したかったのです。

コードは次のとおりです。

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


int vectorSum(int x[], int y[], int n, int sum[]) {
}

void display_Array(int *a, int len){
     //Declerations
     int i;
     for(i=0; i<len; i++)
     {
          printf("%d ", a[i]);
     }
     printf("\n");    
 }

//Implement a nice randomizing function...Fisher-Yates shuffle

int main(void){
    //Generate a random length for the array
    srand(time(NULL));
    int N = (rand()*rand())%100;

    //Declarations
    int *x = (int *) malloc(N * sizeof(*x)); //Because I don't know how large my array is ahead of time
    int *y = (int *) malloc(N * sizeof(*y));
    int i;

    //Fill the arrays
    for(i=0; i<10; ++i) {
         x[i] = (rand()*rand())%100000;
         y[i] = (rand()*rand())%100000;
    }

    display_Array(x, N);
    getchar();


    //Main execution...



}

このコードは完成間近ではないことに注意してください。お好きなだけ批評してください。洗練されていないことは承知しています。しかし、私は奇妙なことに気づきました。私の出力は、多くの場合、次のパターンに従います。

w, x, y...z, 0, 0, 0, 0, 0, 0, 0, 0.

多くの場合、配列の最後の値は 0 です。常にではありませんが、多くの場合、そうではありません。さらに、このパターンは通常複数発生します。たとえば、最後の 2 つの値が 0、0 である場合、プログラムを再度実行すると、最後の 4 桁は 0、0、0、0 のようになります。

それで、なぜこれが起こるのですか?疑問はありますが、他の方の意見をお聞きしたいです。

4

2 に答える 2

4

C配列の値を初期化しません。したがって、設定されていないセルで見つかるのは、単に消去されていないメモリの内容です (そして、割り当てられたすべてのセルをループし、最初の 10 個の値のみを設定すると、それらがたくさんあります)。メモリが「クリア」されている場合は、ほとんどの場合ゼロが表示されますが、以前の反復/他のプログラムからのガベージがある場合は、任意の種類の値を取得できます。

于 2013-09-19T05:55:11.313 に答える
4

次のコード行を変更します。

 for(i=0; i<10; ++i)

for(i=0; i<N; ++i)

また、使用しないでくださいrand() * rand()。整数オーバーフローが発生します。代わりに just を使用しrand()ます。

于 2013-09-19T05:59:12.180 に答える