|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
[C] Problema con i puntatori e la connessa aritmetica
Ciao a tutti,
mi sto leggendo il capitolo sui puntatori del K&R. Ho provato a compilare un esercizio, precisamente questo: Codice:
#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf; /* puntatore al primo elemento dell'array */
char *alloc(int n) {
if (allocbuf + ALLOCSIZE - allocp >= n) { /* controlla se c'è sufficiente spazio */
allocp += n;
return allocp - n;
} else {
return 0;
}
}
void afree(char *p) {
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
Codice:
#include "allocatore.h"
#include <stdio.h>
int main() {
char *tmp = alloc(5);
int i = (int) tmp + 5;
for (++tmp; tmp < i; ++tmp)
*(tmp++) = 'c';
*tmp = '\0';
printf("%s\n", *tmp);
return 0;
}
Grazie in anticipo Giorgio
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
E in ogni caso alla fine vuoi stampare una stringa (%s) ma passi un carattere *tmp (ed è sbagliato) e in ogni caso il puntatore è ormai sul nullo finale.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Codice:
#include "allocatore.h"
#include <stdio.h>
int main() {
char *tmp = alloc(5);
int i = (int) tmp + 5;
for (++tmp; tmp < i; ++tmp)
*(tmp++) = 'c';
*tmp = '\0';
printf("%s\n", *tmp);
return 0;
}
perche´ per un semplice ciclo casti un char* ad int ? capisco tu voglia sperimentare i brividi della dinamicita´ a questo punto definiscilo ed usa la define ovunque Poi se usi questo ciclo: Codice:
for (++tmp; tmp < i; ++tmp) viene eseguita. Codice:
*tmp = '\0'; il che significa che tmp punta a tmp+6, fuori dall´array, hai sforato. Ti va bene (ma non sempre) e non crasha il programma ma se poi stampi Codice:
printf("%s\n", *tmp);
__________________
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 |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Quote:
Ora ho provato a modificare così il main: Codice:
#include "allocatore.h"
#include <stdio.h>
int main() {
char *tmp = alloc(5); //alloco 5 byte
char *p = tmp + 4; // fine del ciclo dopo 4 byte
char c = 'a';
for (tmp; tmp < p; tmp++)
*tmp = c++; // scrivo all'interno di tmp il carattere c
*tmp = '\0'; // al termine inserisco il carattere di chiusura
printf("%s\n", tmp); //dovrei stampare tutto a video
return 0;
}
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
io ti ho scritto perche´
__________________
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 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Si, ma ora uso il puntatore tmp all'interno della printf, quindi si dovrebbe riferire a tutta la stringa. O?
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
for (tmp; tmp < p; tmp++) Alla fine del ciclo punta alla fine dell´array. Infatti alla fine del ciclo tu setsso fai: Codice:
*tmp = '\0'; ti consiglio (cosi´ al volo) un: Codice:
char *array = alloc(5);
char *tmp = array;
// usi tmp per fare quello che fai e la printf diventa:
printf("%s\n", array);
__________________
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 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Codice:
void afree(char *p) {
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
![]() che poi e´ anche in romano, la dovresti vedere bene tu ... afree
__________________
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 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Grazie mille,
sono proprio rintronato oggi.. Ciauz
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:52.





















