|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Stranezze del C
Ho un segmentation fault che mi blocca inesorabilmente un programma che sto facendo, dopo averle provate un po' tutte, senza esito, ho fatto delle prove scrivendo questo programmino banale....
Codice:
#include <stdio.h>
int main ()
{
char *parola;
printf("Inserisci una parola.\n");
scanf("%s", parola);
printf("La parola immessa e': %s", parola);
return 0;
}
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
char parola[128];
Ovviamente sei a rischio di buffer overflow.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
Tra l'altro se aggiungo una dichiarazione di una variabile di tipo char, che non uso, il programma funziona correttamente, non riesco a capire perchè.. Codice:
#include <stdio.h>
int main ()
{
char c;
char *parola;
printf("Inserisci una parola.\n");
scanf("%s", parola);
printf("La parola immessa e': %s", parola);
return 0;
}
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Metti ad es. char c; char *parola = NULL; e vedrai che il caro segfault ritorna.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#5 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Stranezze?
A me sembra "solo" mancata comprensione del funzionamento dei puntatori... Quote:
Adopera la funzione malloc per dedicare una regione di memoria cui far puntare la variabile parola. Quote:
Il mio consiglio è di usare fgets invece di scanf, tanto devi leggere stringhe e non valori numerici. Quote:
Ah: ovviamente, prima di terminare il programma, devi ricordarti di liberare la memoria allocata per la variabile parola, adoperando la funzione free.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
Codice:
#include <stdio.h>
#include <malloc.h>
#define DIM_STR 50
int main {
char *parola;
parola = (char *) malloc (sizeof(char)*DIM_STR);
printf("Inserisci una parola.\n");
scanf("%s", parola);
printf("La parola immessa e': %s", parola);
return 0;
}
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Ho afferrato..
Domanda: allocare dinamicamente n caratteri con la malloc o dichiarare direttamente un array di n posizioni è la stessa cosa ai fini pratici? Es: Codice:
#define DIM_STR 32 char *parola; parola = (char *) malloc (sizeof(char)*DIM_STR); parola = bla bla... free(parola); Codice:
#define DIM_STR 32 char parola[DIM_STR] parola = bla bla...
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#10 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Naturalmente no: un array statico quello è e quello rimane, mentre un array dinamico può anche essere ridimensionato con la funzione realloc.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Quote:
Volendo usare fgets, come consigliato, il comando sarebbe una cosa del tipo: fgets(parola, DIM_STR, stdin) ? Se volessi controllare che la parola inserita contenga solo caratteri alfabetici (e non cifre, spazi o simboli vari), dovrei a posteriori scandire l'array char per char oppure ci sono dei parametri con cui poter direttamente chiamare fgets() ?
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
|
|
|
|
|
|
#12 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16212
|
Quote:
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
nel caso la grandezza della stringa la chiedi all'utente...potresti usare una cosa di questo tipo:
Codice:
#ifndef DIM #define DIM variabile_integer char str[variabile_integer] #endif Comunque sia non è una buona cosa da fare. E' più che altro per imparare il linguaggio |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:49.




















