Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 19 su 19
  1. #11
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Lak3d
    beh, la mia domanda nasceva dal fatto che se passo a duna printf numeri.Nome mi stampa la stringa, quindi un paragone con un operatore logico dovrebbe paragonare le due stringhe...
    La printf riceve il puntatore ed estrae i caratteri per visualizzarli esattamente come fa la strcmp che invece esegue un confronto (meglio una sottrazione) ...

  2. #12
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    adesso è abbastanza chiaro... comunque i puntatori bene o male li ho digeriti, son le stringhe che mi creano spesso problemi.

  3. #13
    Originariamente inviato da Lak3d
    Perchè invece di usare strcmp facevo un confronto normalissimo fra i due elementi risolvendo il puntatore visto che con l'operatore * solitamente si risolve il riferimento...
    Se tu dereferenzi un puntatore a char otterrai un char, ossia solo il primo carattere della stringa.
    Se tu fai una cosa del genere:
    codice:
    char str1[]="ciao";
    char str2[]="ciau";
    if (*str1=*str2) 
        printf("Uguali");
    else
        printf("Diversi");
    Il programma ti dirà che le due stringhe sono uguali, perché dereferenziando il puntatore ottiene un valore char 'c' per entrambe le stringhe.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #14
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    ovvio, in quel caso nemmeno inizializzi il puntatore ma usi il nome del vettore essendo un puntatore al suo primo elemento... quello di cui parlavo era fondamentalmente la stessa cosa ma con un inizializzazione di questo tipo:

    char *str1="ciao";
    char *str2="ciau";

    l'istruzione if str1>str2 dovrebbe a quanto ho capito valutare l'indirizzo di memoria del primo carattere della stringa con quello della seconda stringa... Invece io pensavo valutasse l'intera stringa, o al massimo il primo carattere di ognuna.

    if *str1>*str2
    e così che valuta? il primo carattere?

  5. #15
    Originariamente inviato da Lak3d
    ovvio, in quel caso nemmeno inizializzi il puntatore ma usi il nome del vettore essendo un puntatore al suo primo elemento... quello di cui parlavo era fondamentalmente la stessa cosa ma con un inizializzazione di questo tipo:

    char *str1="ciao";
    char *str2="ciau";
    Il codice che ho scritto io e questo sono perfettamente identici.
    l'istruzione if str1>str2 dovrebbe a quanto ho capito valutare l'indirizzo di memoria del primo carattere della stringa con quello della seconda stringa... Invece io pensavo valutasse l'intera stringa, o al massimo il primo carattere di ognuna.
    Un puntatore, se non dereferenziato, è un semplice indirizzo, per cui gli operatori di confronto giustamente confrontano gli indirizzi.
    if *str1>*str2
    e così che valuta? il primo carattere?
    Esattamente, anche se mancano le parentesi.
    codice:
    if (*str1>*str2)
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #16
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    ah ok, quindi la forma vettore di char e puntatore a char non cambia praticamente in nulla se non che col primo bisogna per forza definire in partenza un limite nella grandezza dell'array mentre nel secondo no?

    e quindi la situazione vettore di puntatori a char per creare un vettore di stringhe può essere sostiutita con un array di array di tipo char?

  7. #17
    Leggiti bene il manuale... La tua sintassi char * str="stringa"; sottintende comunque l'allocazione della memoria necessaria a contenere "stringa" nello stack (e non nell'heap), per cui quando tu scrivi:
    codice:
    char str[]="ciao";
    o
    codice:
    char str*="ciao";
    tu stai scrivendo in realtà:
    codice:
    char str[5];
    str[0]='c';
    str[1]='i';
    str[2]='a';
    str[3]='o';
    str[4]='\0';
    In sostanza, si tratta in entrambi i casi di una sintassi abbreviata per non fare impazzire il programmatore tutte le volte che vuole inserire una stringa nel programma; in entrambi i casi la dimensione del vettore viene determinata al momento della compilazione, per cui non puoi comunque sforare i limiti dell'array.
    Quanto a creare array di stringhe, di solito si creano degli array di puntatori a stringhe, tipo questo:
    codice:
    char str1[]="stringa di lunghezza x1";
    char str2[]="stringa più corta";
    char str3[]="stringa lunghissimissimissimissimissimissimissima";
    char * array[3]={str1;str2;str3};
    ovviamente i puntatori inseriti nell'array di stringhe possono anche puntare a della memoria non allocata sullo stack a compile-time ma a della memoria allocata sull'heap a run-time con malloc.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #18
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    sì, ma è un pò dura definire come membro di una struttura un array di char senza dimensionarlo...
    almeno io ho avuto questo problema quando ho definito la struct che vedi nel secondo mio post.... ecco cosa intendevo.

  9. #19
    Certo, infatti in una struttura si usano i puntatori mica per niente... anche se in un programma serio ai puntatori interni alla struttura devono essere assegnate stringhe allocate dinamicamente. Faccio un esempio:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct ts
    {
    	char * tpointer;
    };
    void test(ts str);
    
    int main(int argc, char * argv[])
    {
    	ts tst;
    	tst.tpointer=0;
    	test(tst);
    	printf("%s",tst.tpointer); //Qui si verificherà un errore di accesso alla memoria
    	return 0;
    }
    void test(ts str)
    {
    	char * tst="test";
    	str.tpointer=tst;
    	return;
    }
    Alla printf si verifica un errore di accesso alla memoria perché a tst.tpointer è stata assegnato in test un puntatore ad una variabile locale, che come tale è immagazzinata sullo stack, che viene pulito all'uscita della funzione. Questo programma dovrebbe essere riscritto in maniera da allocare la memoria per la stringa nell'heap con malloc.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.