1

こんにちは皆さん、ご迷惑をおかけして申し訳ありませんが、ここでそれを失い始めています。最近、Cでプログラミングを再開しましたが、なんらかのバグが発生しました。プログラムは簡単なものであるため、次のことを行う必要があります。0が読み取られるまで、未定義の数の自然要素がキーボードから読み取られます。その後、すべての要素の積を計算し、その結果の最後にある0の数を計算する必要があります。

int input(int* v)                      {

    int n = 0;   
    do                                                            
    {
        n = n + 1;
        v = (int*) realloc(v,n*sizeof(int));        printf("Enter number %d: ",n);          scanf("%d",&v[n-1]);
    }
    while(v[n-1] != 0);           
    n--;
    return n;  }

int tZeros(int* v, int eNb)     {    
    int i;
    int  val = 1;
    for(i = 0; i < eNb; i++)
    {
        val = val * v[i];        
    }

    i=0;
    while(val % 10 == 0)
    {
        i++;
    }  
    return i; }

int main (int argc, char** argv)     {

    int* v = NULL;                                                  
    int eNb = input(&(*v));                                          
    if(eNb>0)                                                       
    {
        int zeros = tZeros(v, eNb);
        printf("The number of ending zeros in the product of the given numbers is: %d",zeros);

    }
    else
    {
        printf("No elements to do computations with!\n");
    }
    free(v);
    return 0; 
    }

input関数は、動的配列内の要素の数と実際の要素の2つを返す必要があります。ただし、input関数を実行すると、入力された値はすべて失われます。引数をポインターとして入力に渡すので、変更する必要があります。正しいアドレスの値は正しいですか?

すべての提案は大歓迎です!Thnx!

PS問題は私の配列にあると思いますv..入力関数を終了した後、すべての値が失われます。

4

1 に答える 1

11

Cのすべてが値によって渡されるため、割り当てを実行すると、次のようになります。

v = (int*) realloc(v,n*sizeof(int));

変数のローカルコピーに新しい値を割り当てていますv。ポインター自体の値を変更する場合(ポインターが既に指しているものを変更するのではなく)、ポインターをポインターに渡し、それを1回逆参照して、割り当てを実行する必要があります。

int ModifyPointer( int **v )
{
    // error checking and whatnot
    *v = realloc(*v,n*sizeof(int));
}

このように考えてください。pメモリアドレス0xAにあり、メモリアドレス0xFFを指すポインタがあります。関数に渡すpと、コピーvが作成されます。コピーvはメモリアドレス0x2Aにありますが、それでもメモリアドレス0xFFを指しています。

                     p(0xA)      v(0x2A)
                       |            |
                        \          /
                         \        /
                          \      /
                            0xFF

したがって、いずれかのポインタを逆参照すると、メモリの同じチャンクを参照することになりますが、ポインタ自体はメモリ内の異なる場所に存在します。したがって、コピーの値を変更しても、元の値には反映されません(つまり、reallocは新しいメモリ位置に新しいポインタを作成し、それを変数に割り当てますvが、p変更されません)。

于 2011-03-09T00:54:21.773 に答える