Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [GCC] warning: function returns address of local variable
Forum - C/C++ - [GCC] warning: function returns address of local variable

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Serginho153 (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/03/2013

Segnala al moderatore
Postato alle 17:02
Domenica, 03/03/2013
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define N 10
  4.  
  5. char * jstrcat(char *s1, char *s2);
  6.  
  7. int main()
  8. { char s1[N+1], s2[N+1], *s;
  9.   scanf("%s", s1);
  10.   scanf("%s", s2);
  11.   s=jstrcat(s1, s2);
  12.   printf("%s", s);
  13. return 0;
  14. }
  15.  
  16. char * jstrcat(char *s1, char *s2)
  17. { char s[2*(N+1)];
  18.   *s2=*s1+N;
  19.   *s=*s1;
  20. return s;
  21. }


Salve ragazzi sono nuovo. Non ho ancora afferrato benissimamente come usare i puntatori...So che *p vuol dire il valore puntato da p, quindi sarebbe &a, cioè l'indirizzo della variabile a...Tuttavia non sono ancora così ferrato. Sapete dirmi perchè mi da quest'errore? warning: function returns address of local variable

Ho dimenticato di dire che l'esercizio vuole che date due stringhe, stampi a video la loro concatenazione. Grazie

Ultima modifica effettuata da Serginho153 il 03/03/2013 alle 17:05
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:31
Domenica, 03/03/2013
perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array

PM Quote
Avatar
Serginho153 (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/03/2013

Segnala al moderatore
Postato alle 17:38
Domenica, 03/03/2013
Testo quotato

Postato originariamente da TheDarkJuster:

perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array


Quindi? Cosa dovrei cambiare?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 17:53
Domenica, 03/03/2013
Ciao!

Per risolvere il problema ci sono molteplici soluzioni:

_Dichiarare i vettori nel main, e effettuare le operazioni in  jstrcat

_Allocare dinamicamente memoria in jstrcat, ed effettuare le operazioni di concatenamento.

Nel concatenamento delle stringhe, controlla il terminatore.


PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:01
Domenica, 03/03/2013
Codice sorgente - presumibilmente C++

  1. char * jstrcat(char *s1, char *s2)
  2. { char *s = (char*)malloc(sizeof(char)*(2*(N+1)));
  3.   *s2=*s1+N;
  4.   *s=*s1;
  5. return s;
  6. }



Ti ricordo inoltre che dichiarare array che variano la dimensione a runtime è una delle più brutte idee che ti possano venire, in questo caso è bastato correggere con un malloc, fa le stesse cose, la dimensione è variabile, tratti la variabile come un array e non hai più il problema che avevi prima nel tipo di ritorno.

PM Quote
Avatar
Serginho153 (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/03/2013

Segnala al moderatore
Postato alle 18:20
Domenica, 03/03/2013
Testo quotato

Postato originariamente da TheDarkJuster:

Ti ricordo inoltre che dichiarare array che variano la dimensione a runtime è una delle più brutte idee che ti possano venire, in questo caso è bastato correggere con un malloc, fa le stesse cose, la dimensione è variabile, tratti la variabile come un array e non hai più il problema che avevi prima nel tipo di ritorno.


Ma N è una costante, come fa a variare?
Non mi va anche se incollo il tuo codice...

Testo quotato

Postato originariamente da Poggi Marco:
Ciao!
_Dichiarare i vettori nel main, e effettuare le operazioni in  jstrcat


Scusate la mia ignoranza ma quali vettori dovrei dichiarare nel main? Ho già dichiarato s, s1, s2
Testo quotato

Postato originariamente da Poggi Marco:
Ciao!
_Allocare dinamicamente memoria in jstrcat, ed effettuare le operazioni di concatenamento.
Nel concatenamento delle stringhe, controlla il terminatore.


Dici come mi ha consigliato ThedarkJuster? ho copiato il suo codice, dopo averlo eseguito mi da lo stesso output. Cioè mi da il primo carattere della prima stringa e basta.

Come controllo il terminatore? E soprattutto ti riferisci a '\0'?

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:22
Domenica, 03/03/2013
Scusa tanto, ero di fretta e non avevo controllato se N era costante, comunque il senso è quello, se vuoi ritornare un char* la variabile deve essere char* non char[], ti pare? E sì, il carattere terminatore è lo 0x00 altrimenti chiamato '\0'. Comunque tu hai fatto un pasticcio enorme! Usa questo:
Codice sorgente - presumibilmente C++

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include <iostream>
  4. #include <string.h>
  5. #include <malloc.h>
  6. #define N 10
  7.  
  8. char * jstrcat(char*, char*, int, int);
  9.  
  10. int main()
  11. { char s1[N+1], s2[N+1], *s;
  12.   gets(s1);
  13.   gets(s2);
  14.   s=jstrcat(s1, s2, strlen(s1), strlen(s2));
  15.   printf("%s", s);
  16. return 0;
  17. }
  18.  
  19. char * jstrcat(char *s1, char *s2, int s1length,int s2length)
  20. {
  21.         char *s = (char*)malloc(s1length+s2length);
  22.         int i;
  23.         for (i = 0; i < s1length; i++)
  24.                 s[i] = s1[i];
  25.         int currentPositionOnS = i;
  26.         for (i = 0; i < s2length; i++)
  27.         {
  28.                 s[currentPositionOnS] = s2[i];
  29.                 currentPositionOnS++;
  30.         }
  31.         s[currentPositionOnS] = '\0';
  32.         return s;
  33. }

e tieni conto che non sei in pascal quindi non puoi fare s1 = s2 se s1 ed s2 sono array!!!

Ultima modifica effettuata da il 03/03/2013 alle 18:32
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:40
Domenica, 03/03/2013
Il warning ti viene dato perche' quando allochi dinamicamente un array usando:

Codice sorgente - presumibilmente C/C++

  1. char s[2*(N+1)];



Lo spazio viene allocato sullo stack (il quale verra' deallocato al momento del return). Usando malloc() utilizzi lo spazio sull'heap, quindi dovrai ricordarti di deallocare lo spazio manualmente con free().

Ultima modifica effettuata da pierotofy il 03/03/2013 alle 18:41


Il mio blog: https://piero.dev
PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 18:46
Domenica, 03/03/2013
Testo quotato

Postato originariamente da TheDarkJuster:

perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array



ehm puntatore e array sono la stessa cosa in c...

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

quello che il compilatore ti dice é: occhio perché la funzione che hai scritto ritorna un puntatore ad una variabile che verrá deallocata una volta usciti dalla funzione stessa quindi il suo valore perde senso e potrebbe portare ad un comportamento anomalo del programma(seg fault, memory leak, etc....)...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo