Function returns pointer to garbage, and free locks the terminal

5

Can anyone explain to me why I give free in pontaux the Windows terminal stops responding? And why when I pontmaior my result comes as memory garbage?

The function returns a pointer to the largest value of a vector.

Code:

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

int* retornamaior (int *vetor, int tamanho) {

    int i, maior = vetor[0];

    for (i=0; i<tamanho; i++) {
        if (vetor[i]>=maior)
            maior = vetor[i];   
        }

    int *pontmaior = &maior;

    return pontmaior;
}

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

    int *vetor, tamanho, i;

    printf ("Digite o tamanho da sequência: ");
    scanf ("%d", &tamanho);

    vetor = (int*)malloc(tamanho*sizeof(int));

    printf ("Digite a sequência: ");

    for (i=0; i<tamanho; i++)
        scanf ("%d", &vetor[i]);

    int *pontaux = retornamaior (vetor,tamanho);

    printf ("Maior: %d\n", *pontaux);

    free (vetor);

    return 0;   
}
    
asked by anonymous 08.02.2014 / 01:41

2 answers

6

The error seems to be here:

int *pontmaior = &maior;

You are returning a pointer to the "greater" stack variable, which no longer exists when it is used by main ().

You should return a single integer indicating which array item "vector" is the largest. It's safer, avoid that lot of pointer manipulations.

It would look something like this:

int retornamaior (int *vetor, int tamanho)
{
        int i, maior = 0;
        for (i=0; i<tamanho; i++) {
                if (vetor[i]>=vetor[maior])
                        maior = i;
        }
        return maior;
}

int main (int argc, char *argv[])
{
        int *vetor, tamanho, i;

        printf ("Digite o tamanho da sequência: ");
        scanf ("%d", &tamanho);

        vetor = (int*)malloc(tamanho*sizeof(int));

        printf ("Digite a sequência: ");

        for (i=0; i<tamanho; i++)
                scanf ("%d", &vetor[i]);

        int pontaux = retornamaior (vetor,tamanho);

        printf ("Maior: %d\n", vetor[pontaux]);

        free (vetor);

        return 0;
}

If you are keen to return a pointer:

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

int* retornamaior (int *vetor, int tamanho) {

    int i, *maior = &vetor[0];

    for (i=0; i<tamanho; i++) {
        if (vetor[i]>=*maior)
            maior = &vetor[i];
        }

    return maior;
}

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

    int *vetor, tamanho, i;

    printf ("Digite o tamanho da sequência: ");
    scanf ("%d", &tamanho);

    vetor = (int*)malloc(tamanho*sizeof(int));

    printf ("Digite a sequência: ");

    for (i=0; i<tamanho; i++)
        scanf ("%d", &vetor[i]);

    int *pontaux = retornamaior (vetor,tamanho);

    printf ("Maior: %d\n", *pontaux);

    free (vetor);

    return 0;
}
    
08.02.2014 / 01:48
3

I saw the response from epx and I realized that if you lost a bit to understand why the following code snippet

int *pontmaior = &maior;

is wrong, what happens is that when you declare int *pointmaior within your function you are declaring a variable that will only exist within the scope of the int* retornamaior (int *vetor, int tamanho) function, ie, the memory area destined for that variable will be released by the system at the end of the execution of this function, thus, when executing the line

printf ("Maior: %d\n", *pontaux);

You will already attempt to access an invalid area of memory.

    
08.02.2014 / 17:35