Problema Malloc in visual studio 2015 in una funzione.

angelo0001

Utente Èlite
3,741
594
CPU
AMD Ryzen 7 5700X
Dissipatore
Noctua NH-D15
Scheda Madre
Gigabyte AX370 Gaming K7
HDD
Crucial P5 plus 1TB + 750GB SSD SATA + 14TB HDD
RAM
16GB DDR4 G-Skiill Trident Z RGB 3200Mhz CL16
GPU
Zotac RTX 3060 TI Twin Edge
Audio
Integrata
Monitor
Xiaomi Mi Monitor 2K 1440P@165HZ
PSU
EVGA Supernova 650G2
Case
NZXT H440 Red
Net
EOLO 100
OS
Windows 11
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.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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]);
    }
}
 

angelo0001

Utente Èlite
3,741
594
CPU
AMD Ryzen 7 5700X
Dissipatore
Noctua NH-D15
Scheda Madre
Gigabyte AX370 Gaming K7
HDD
Crucial P5 plus 1TB + 750GB SSD SATA + 14TB HDD
RAM
16GB DDR4 G-Skiill Trident Z RGB 3200Mhz CL16
GPU
Zotac RTX 3060 TI Twin Edge
Audio
Integrata
Monitor
Xiaomi Mi Monitor 2K 1440P@165HZ
PSU
EVGA Supernova 650G2
Case
NZXT H440 Red
Net
EOLO 100
OS
Windows 11
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
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili