C -> sizeof string è sempre 8

#include "usefunc.h" //don't worry about this -> lib I wrote int main() { int i; string given[4000], longest = "a"; //declared new typdef. equivalent to 2D char array given[0] = "a"; printf("Please enter words separated by RETs...\n"); for (i = 1; i  sizeof(longest)) { longest = given[i]; } */ printf("%lu\n", sizeof(given[i])); //this ALWAYS RETURNS EIGHT!!! } printf("%s", longest); } 

Perché restituisce sempre 8 ???

Non c’è un tipo di dati string in C. Questo è C ++? O è una string typedef?

Supponendo che la string sia un typedef per char * , ciò che si desidera è strlen , non sizeof . L’8 che si ottiene con sizeof è in realtà la dimensione del puntatore (al primo carattere nella stringa).

Lo considera come un puntatore, la dimensione di un puntatore è ovviamente di 8 byte = 64 bit sulla macchina

Dici “non preoccuparti di questo -> lib ho scritto” ma questa è l’informazione critica, poiché definisce la stringa. Presumibilmente la stringa è char * e la dimensione di quella sulla vostra macchina è 8. Quindi, sizeof (dato [i]) è 8 perché dato [i] è una stringa. Forse vuoi strlen piuttosto che sizeof.

Questo è un errore comune tra la matrice di caratteri e il puntatore a dove inizia quella matrice.

Ad esempio la stringa letterale in stile C:

 char hello[14] = "Hello, World!"; 

È 14 byte (13 per il messaggio e 1 per il carattere di terminazione null). È ansible utilizzare sizeof() per determinare la dimensione di una stringa di stile C non elaborata.

Tuttavia, se creiamo un puntatore a quella stringa:

 char* strptr = hello; 

E prova a trovare la sua dimensione con sizeof() , restituirà sempre la dimensione di un puntatore di dati sul tuo sistema.

Quindi, in altre parole, quando si tenta di ottenere la dimensione della stringa da una libreria di stringhe, si ottiene solo la dimensione del puntatore all’inizio della stringa. Quello che devi usare è la funzione strlen() , che restituisce la dimensione della stringa in caratteri:

 sizeof(strptr); //usually 4 or 8 bytes strlen(strptr); //going to be 14 bytes 

Mi auguro questo chiarisca tutto!