2015-09-15 2 views
-2

У меня есть следующий кодкак сохранить указатель приращение

void fun(int * d) 
    { 
    d+=1; 
    } 

    int main() 
    { 
     int * f=malloc(5); 
     f[0]=0;f[1]=1;f[2]=2;f[3]=3;f[4]=4; 
     fun(f); 
     printf("value : %d\n",*f); 
     return 0; 
    } 

Итак, я передать целое указатель на функцию и увеличить его там. Я хочу, чтобы этот приращение сохранялся, когда он возвращается к основному. Когда я печатаю значение, выход «0». Но я хочу, чтобы результат был «1», поскольку я увеличил значение в функции.

Итак, вкратце, мой вопрос заключается в том, как сохранить изменения, внесенные в указатель?

+4

Кроме того, 'malloc (5)' будет выделять 5 байтов, что чаще всего не совпадает с 5 int. –

+1

Как сказал @BoPersson, вы должны сделать 'malloc (5 * sizeof (int))', чтобы получить правильное количество памяти, или 'malloc (5 * sizeof * f)', если вы когда-нибудь передумали о '* f типа. –

ответ

4

Предполагая, что вы хотите, чтобы увеличить указатель, не значению, у вас есть два варианта:

  1. переделать функцию void fun(int ** d), использовать (*d)+=1; в теле функции, и вызов с использованием fun(&f);

  2. Восстановить функцию до int* fun(int* d) и вернуть новое значение.

Если вы хотите увеличить значение, а затем использовать (*d)+=1; в теле функции.

Вам не нужны круглые скобки вокруг *d: Я поставил их для ясности.

+0

Теперь я хочу сохранить изменения, внесенные в указатель, когда задействованы вложенные вызовы функций. main() вызывает fun1() и fun1() вызывает fun2(). изменения производятся для указателя в fun2().Как сохранить их в основной функции? Использовать тройной указатель ?? – user5338618

+0

Нет, вы можете поддерживать два уровня косвенности. Наверное, лучше, если вы зададите новый вопрос с хорошим качеством, поддерживающим фрагмент кода. – Bathsheba

0

Вы должны пройти адрес указателя, так:

void fun(int **val) { 
    *val++; 
    .... 
} 
int main() { 
    ... 
    fun(&f); 
    ... 
} 
1

Вы забыли * в д + = 1;

Когда вы передаете этот указатель у вас есть доступ к е [0] с таким подходом: Посмотрите здесь:

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

void fun(int *d){ 
    *d+=1; 
} 

int main(void){ 
    int i; 
    int *f=malloc(5 * sizeof int); 

    f[0]=0;f[1]=1;f[2]=2;f[3]=3;f[4]=4; 

    for(i=0;i<5;i++){ 
     printf("%d ",f[i]); 
    } 

    printf("\n"); 

    fun(f); 

    for(i=0;i<5;i++){ 
     printf("%d ",f[i]); 
    } 
    free(f); 
    return 0; 
} 

Выход:

0 1 2 3 4 
1 1 2 3 4 

Или, если вы попробуйте добавить +1 ко всем элементам, вы можете сделать что-то вроде этого:

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

int *fun(int *d, int len){ 
    int i; 
    int *newArray = d; 
    int newValue = 1; 

    printf("\n"); 
    for(i = 0; i < len; i++) { 
     newArray[i] += newValue; 
    } 

    return newArray; 
} 

int main(void){ 
    int i; 
    int f[] = {0,1,2,3,4}; 
    int *newArray; 

    f[0]=0;f[1]=1;f[2]=2;f[3]=3;f[4]=4; 

    for(i=0;i<5;i++){ 
     printf("%d ",f[i]); 
    } 

    printf("\n"); 



    newArray = fun(f,5); 

    for(i=0;i<5;i++){ 
     printf("%d ",newArray[i]); 
    } 
    return 0; 
} 

Выход:

0 1 2 3 4 
1 2 3 4 5 

И кстати вы забыли освободить е.

+0

Плюс один для определения утечки. – Bathsheba

Смежные вопросы