Problema Malloc in visual studio 2015 in una funzione.

Pubblicità

angelo0001

Utente Èlite
Messaggi
4,071
Reazioni
638
Punteggio
141
Dovrei creare un programma nel quale bisognerebbe stabilire la dimensione di un puntatore all'interno di una funzione:
definendo la dimensione all'esterno funziona:
Codice:
#include "stdafx.h"
#include "stdlib.h"

void carica(int *p, int n);
void stampa(int *p, int n);

int main()
{
    int *p = NULL;
    int n;
    printf("Inserisci il numero di elementi: ");
    scanf("%d", &n);
    p = (int *)malloc(sizeof(int) * n);
    carica(p,n);
    stampa(p,n);
}

void carica(int *p, int n)
{
    for (int i = 0;i < n;i++)
    {
        printf("inserisci elemento %d: ", i + 1);
        scanf("%d", &p[i]);
    }
}

void stampa(int *p, int n)
{
    for (int i = 0;i < n;i++)
    {
        printf("\nelemento %d: %d", i + 1,p[i]);
    }
}

se usassi la malloc nella funzione, il vettore verrebbe letto correttamente ma nella stampa escono valori strani:
Codice:
#include "stdafx.h"
#include "stdlib.h"

void carica(int *p, int *n);
void stampa(int *p, int n);

int main()
{
    int *p = NULL;
    int n = NULL;
    carica(p,&n);
    stampa(p,n);
}

void carica(int *p, int *n)
{
    printf("Inserisci il numero di elementi: ");
    scanf("%d", &(*n));
    p = (int *)malloc(sizeof(int) * (*n));
    for (int i = 0;i < *n;i++)
    {
        printf("inserisci elemento %d: ", i + 1);
        scanf("%d", &p[i]);
    }
}

void stampa(int *p, int n)
{

    for (int i = 0;i < n;i++)
    {
        printf("\nelemento %d: %d", i + 1,p[i]);
    }
}


Ho letto che è bnecessario che usi un puntatore a un puntatore in questo modo:
Codice:
#include "stdafx.h"
#include "stdlib.h"

void carica(int **p, int *n);
void stampa(int *p, int n);

int main()
{
    int *p = NULL;
    int n = NULL;
    carica(&p,&n);
    stampa(p,n);
}

void carica(int **p, int *n)
{
    printf("Inserisci il numero di elementi: ");
    scanf("%d", &(*n));
    (*p) = (int *)malloc(sizeof(int) * (*n));
    for (int i = 0;i < *n;i++)
    {
        printf("inserisci elemento %d: ", i + 1);
        scanf("%d", &(*p[i]));
    }
}

void stampa(int *p, int n)
{

    for (int i = 0;i < n;i++)
    {
        printf("\nelemento %d: %d", i + 1,p[i]);
    }
}

in questo caso il programma si blocca alla lettura del secondo elemento, cioè quello di indice 1; anche se usassi la mallorc all'esterno della funzione, quindi nel main, utilizzando il puntatore a un puntatore otterrei lo stesso errore.
 
Ci sono altri modi per evitare ciò, ma se vuoi usare questa forma, allora l'unica è un puntatore di puntatore proprio come hai trovato navigando.
Questa è la sintassi corretta:

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

void carica(int **p, int *n);
void stampa(int *p, int n);

int main()
{
    int *p = NULL;
    int n = 0;
    carica(&p,&n);
    stampa(p,n);
   
    return 0;
}

void carica(int **p, int *n)
{
    printf("Inserisci il numero di elementi: ");
    scanf("%d", n);
   
    *p = malloc(sizeof(int) * (*n));
   
    for(int i = 0;i < (*n); i++)
    {
        printf("inserisci elemento %d: ", i + 1);
        scanf("%d", &((*p)[i]));
    }
}

void stampa(int *p, int n)
{  
    for(int i = 0;i < n;i++)
    {
        printf("\nelemento %d: %d", i + 1,p[i]);
    }
}
 
Il programma funziona correttamente adesso.
Quali sarebbero le altre modalità?
Un'altra domanda : Vorrei salvare il contenuto della console in un file, ho visto un codice che dirotta stdout su un file, ma così non mi è possibile visualizzare a schermo l'output. Ho gia trovato la funziona che individua il file nel quale salvare, salvando via via con un numero crescente, oppure con il nomw inserito dall utente
 
Pubblicità
Pubblicità
Indietro
Top