PDA

Visualizza la versione completa : [C] Sorgente che produce 2 risultati diversi a seconda del sistema operativo


heretic99
09-06-2008, 04:19
per quelche motivo a me oscuro questo prog produce output diverso su linux e sul macosx86 su intel
(mac su pc di casa non mac...)
se mi sapete spiegare il perche vi ringrazio molto .!! io non ne esco sto impazzendo..
grazie anticipatamente !!

macosx86----------


--->piove col sole
--->piove col mare
--->piove di notte
--->piove poco sole
---------------------------------
---> qipvf dom tome
---> (null)
---> qipvf ei!nptue
---> qipvf qodo!splf
---> // come si puo notare qui la stinga non viene stampata !!! =O
--->(null)
--->qipvf ei!nptue
--->qipvf qodo!splf


------------------------------------------------------------------------------------------------------

Linux-------
--->piove col sole
--->piove col mare
--->piove di notte
--->piove poco sole
---------------------------------
---> qipvf dom tome
---> (null)
---> qipvf ei!nptue
---> qipvf qodo!splf
---> qipvf dom tome // qui tutto ok !!!!
--->(null)
--->qipvf ei!nptue
--->qipvf qodo!splf



----->


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void funz(char **parray);
int main(){
int c;
char* str1 = calloc (10,(sizeof (char)));
char* str2 = calloc (10,(sizeof (char)));
char* str3 = calloc (10,(sizeof (char)));
char* str4 = calloc (10,(sizeof (char)));
char** stringa;
stringa = (char **) calloc (4,(sizeof (char*)));
strcpy(str1, "piove col sole");
strcpy(str2, "piove col mare");
strcpy(str3, "piove di notte");
strcpy(str4, "piove poco sole");
*stringa = str1;
*(stringa+1) = str2;
*(stringa+2) = str3;
*(stringa+3) = str4;
printf("\n\n\n");
printf("--->%s \n",*stringa);
printf("--->%s \n",*(stringa+1));
printf("--->%s \n",*(stringa+2));
printf("--->%s \n",*(stringa+3));
printf("---------------------------------\n");
funz(stringa);
printf("--->%s \n",*stringa);
printf("--->%s \n",*(stringa+1));
printf("--->%s \n",*(stringa+2));
printf("--->%s \n",*(stringa+3));
printf("---------------------------------\n");


}
void funz(char **array){
int c,d;
free (array[1]);
array [1] = NULL;
for (c = 0; c <= 3; c++){
if (array [c] != NULL){
d=0;
while (array [c][d] != '\0'){
array [c][d]++;
d+=2;
}
}
printf("---> %s\n", array[c] );
}
}


non risco ad allegare sorgente ...

Samuele_70
09-06-2008, 06:58
Hai allocato poca memoria : 10 char per ogni stringa sono troppi pochi,
mettine 16 (la dimensione della stringa più lunga, più uno per il terminatore)
e non dovresti avere più problemi.

Ma potresti anche fare in modo che il programma allochi automaticamente
solo la memoria che serve.




int main()
{
int c;
char *text1="piove col sole";
char *text2="piove col mare";
char *text3="piove di notte";
char *text4="piove poco sole";
char *str1 = calloc( strlen( text1)+1, sizeof(char));
char *str2 = calloc( strlen( text2)+1, sizeof(char));
char *str3 = calloc( strlen( text3)+1, sizeof(char));
char *str4 = calloc( strlen( text4)+1, sizeof(char));
char **stringa;
stringa = (char **) calloc (4,(sizeof (char*)));
strcpy(str1, text1);
strcpy(str2, text2);
strcpy(str3, text3);
strcpy(str4, text4);

oregon
09-06-2008, 07:08
"piove col sole" e' lungo 14 caratteri + il terminatore 15 ... e tu allochi solo 10 caratteri ... cosi' come per le altre frasi ... mi sembra che sia chiaro il motivo del problema ...

P.S. Occhio al titolo del thread ... dai un'occhiata al regolamento

LeleFT
09-06-2008, 08:29
Ho corretto il titolo. Leggi il regolamento a riguardo.


Ciao. :ciauz:

heretic99
09-06-2008, 13:30
.... Scusate ... il titolo ... non ci avevo pensato ....
come non avevo pensato al poco spazio allocato da calloc ..
era abbastanza ovvio .. =) sorry

resta il fatto che cmq linux stampava lostesso la frase e mac no ....
bho :master:

grazie !!

mondobimbi
09-06-2008, 13:49
sul comportamento indefinito riguardante a queste situazioni si è già ampiamente discusso.
ciao
sergio

heretic99
09-06-2008, 14:13
a immagino ... infatti non troverò risposta.
grazie a tutti !!!! ripasserò a rompere sicuramente =P

oregon
09-06-2008, 14:19
Originariamente inviato da heretic99
a immagino ... infatti non troverò risposta.

Questa non l'ho capita ... comunque ...

mondobimbi
09-06-2008, 14:54
Originariamente inviato da heretic99
a immagino ... infatti non troverò risposta.
grazie a tutti !!!! ripasserò a rompere sicuramente =P

non capisco perchè un comportamento indefinito del linguaggio C debba sollevare sempre delle perplessità.
Il comportamento è indefinito dal linguaggio e quindi implementato dal compilatore autonomamente. Essendo i compilatore a cui ti riferisci diversi ecco lì il comportamento diverso, in questa situazione non definita a priori.
ciao
sergio

Loading