Разные результаты на разных компьютерах - PullRequest
0 голосов
/ 15 мая 2018

У меня проблема со следующим кодом:

#include <stdlib.h>
#include <stdio.h>
void red(int *);
int main()
{
    int *wsk,i;
    wsk = (int*)malloc(10*sizeof(int));
    for(i=0;i<10;i++)
    {
        wsk[i]=i+100;
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }

    printf("\n\n");
    red(wsk);
    printf("\n\n");
    for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }
    free(wsk);
    return 0;
}
void red(int* wsk)
{
    int i;
    wsk = realloc(wsk,11*sizeof(int));
        for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }
}

На школьном компьютере этот код работает, и указатель wsk в функции red такой же, как и в main.Когда я запускаю один и тот же код на другом компьютере, я получаю разные результаты

Результаты с моего компьютера:

in my computer

Результаты с другогокомпьютер:

other computer

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ваша функция void red(int* wsk) передает wsk по значению , что означает, что локальная версия wsk скопирована в функцию и изменения, сделанные в red, не будут отражены в main.

Один из способов решить эту проблему - вернуть новое значение wsk в main:

int* red(int* wsk) // Return type changed
{
    int i;
    wsk = realloc(wsk,11*sizeof(int));
    for(i=0;i<11;i++)
    {
        printf("value: %d num pointer:%p \n",wsk[i],wsk+i);
    }

    return wsk; // Return new wsk
}

, а затем изменить вызов в main на

wsk = red(wsk);

Так что wsk в main обновляется до wsk, возвращаемого red.


Также обратите внимание, что вы никогда не инициализировали wsk[10] после вызова realloc() и доступа к нему.приведет к более неопределенному поведению.

0 голосов
/ 15 мая 2018

Перераспределенный адрес сохраняется только в красной области действия.Тогда вы разыменовываете старый указатель.

void red(int** wsk)
{
    int i;
    *wsk = realloc(*wsk,11*sizeof(int));
    ...
}
...