Mi történik mikor két változót egyenlővé teszek C-ben?
Írtam egy szám beolvasást ami mindaddig működik amíg nem dolgozok a c változóval, amibe beolvastam az inputot. Nem tudok rájönni miért van így. A választ előre is köszönöm
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m;
int n,c;
m = getchar();
while (m != '\n') {
if ((m >= 48) && (m <= 57)) {
n = m - 48;
} else {return 0;}
c = c*10+n;
m = getchar();
}
printf("%d\n",c);
int i;
i = c;/*ha az értékadást kiveszem jó*/
printf("%d\n",i);
return 0;
}
F#sznak kell ennyit cukrozni a taknyot?!
C++-ban, ha egy lokális változónak nem adsz kézdőértéket, akkor memóriaszemét lesz az értéke.
Innnentől kezdve minden vele végzett számolás "undefined".
„Nekem ez a kód ha hiszintek ha nem linux alatt gcc compilerrel tökéletesen lefut, igen azok ellenére, hogy a c-nek nem adtam értéket.”
Ha hiszed, ha nem, nálam is így tett (lásd fentebb), csak éppen az nem derül ki, hogy ugyanott és ugyanazzal lefordítva a sokat emlegetett i = c; értékadás hogyan változtatja meg c értékét, mert szerintem sehogy. Írd be azt a részt is, és futtasd le.
***
„a probléma ott kezdődig ha a c váltózót nem csak kiíratni akarom hanem vizsgálni az értékét vagy kiolvasni változóba. Miért kap a fejéhez hogy akkor mégis szükség volna a kezdőértékre (int c=0;)?”
Nem fér a fejembe, hogy miből vontad le ezt a következtetést. Ahol a hiba látható (nálam Windows alatt), ott édesmindegy, hogy kezdesz-e valamit c-vel, mert már a sima kiíratásnál is mutatja a „helytelen” értéket. Amikor nem jön elő, akkor megint csak közömbös, mert átmásolva sem történik vele semmi.
***
Az mindenesetre legyen egyértelmű: Ha linuxban esetleg tényleg 0 kezdőértéket ad neki a fordító, az legföljebb érdekesség, a C nyelv szabványában nincs benne, tehát mindenképpen tilos inicializálatlanul lógva hagyni.
Amúgy pedig (#15-re visszautalva) javaslom, hogy c értékét közvetlenül a létrehozás után is, még a beolvasás előtt írasd ki. Ne is írj hozzá másik programot, hanem ebbe szúrjál be egy sort:
int main()
{
int m;
int n, c;
printf("%d\n", c);
//stb.
Biztos vagyok benne, hogy amikor a beolvasás után a várt értéket kapod (pl. linuxos gcc), akkor ez az előzetes kiírás 0 lesz, egyébként pedig más -- értelemszerűen a „hibás” értéknek a beírt szám előtti számjegyeinek megfelelő.
Azt is megteheted, hogy előtte meghívsz egy másik függvényt pár lokális változóval, nem nullával inicializálva, amik szemetet hagynak a stack-ben, és utána hívsz egy inicializálatlan lokális változójú másik függvényt. Elvileg fel fogja rántani a korábban ott hagyott értékeket. (Nem próbáltam ki.)
#include <stdio.h>
#include <stdlib.h>
int f1() {
int a=1;
int b=2;
int c=3;
printf("a:%d b:%d c:%d\n",a,b,c);
}
int f() {
int x;
printf("x: %d\n",x);
}
int main()
{
f1();
f2();
return 0;
}
elírás:
int f() {
helyett:
int f2() {
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!