C-программа, аргумент указателя не будет содержать значения - PullRequest
1 голос
/ 09 марта 2011

Привет, ребята, извините, что беспокою вас об этом, но я начинаю терять это здесь ... Я недавно снова начал программировать на C и столкнулся с какой-то ошибкой, которую просто не могу понять.Моя 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; 
    }

Функция ввода должна возвращать две вещи: количество элементов ифактические элементы в динамическом массиве. Но после того, как входная функция запустит введенные значения, все будут потеряны. Я передаю аргумент на вход в качестве указателя, поэтому он должен изменить значения по правильным адресам, верно?Все предложения приветствуются!Thnx!

Ps Я думаю, что проблема с моим массивом v .. после выхода из функции ввода он теряет все значения ..

1 Ответ

11 голосов
/ 09 марта 2011

Все в C передается по значению, поэтому при выполнении присваивания:

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

Вы присваиваете новое значение локальной копии переменной v. Если вы хотите изменить значение самого указателя (в отличие от изменения на что указатель уже указывает), вам нужно будет передать указатель на указатель и разыменовать его один раз для выполнения присваивания, т. Е.

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 остается без изменений.)

...