[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Kode der aldrig bliver kxrt?



Mads Bondo Dydensborg <sslug@sslug> wrote:
> On Thu, 17 Aug 2000, Bjarke Bruun wrote:

>> Karl Pálsson wrote:
>> > 
>> > Ja, det er en bug.
>> 
>> Nej det er ikke en bug - et int array på [2] er 0,1 og 2 - da plads [2]
>> ikke behøver at være NULL (læs '\0') da '\0' er NULL = 0, derfor er det
>> ikke en bug.

Svar til Bjarke:

Uden at mene det ondt: Hvis vi betalte skolepenge i DK, saa burde du faa refunderet dine, for du er altsaa
blevet indoktirneret med vroevl! Set fra oversaetterens side er den eneste forskel imellem char og int
arrays, laengden af hvert element. Den er fuldstandig ligeglad med, om det er \0 termineret eller ej! 
Som du ogsaa siger, daarlige laerere og boeger. Jeg ville anbefale dig at faa
fat i K&R's C bog, og en fornuftig C++ bog, fx. Stroustrups, omend den ikke er en god laerebog. Du lyder
som om du har haft fat i "Learn XX in 24 minutes" typen... At du har laert C(++) paa Windaase, goer det ikke
bedre, fordi du ikke (noedvendigvis) bliver straffet for at overskrive arrays, eller at du paa Win9(5|8) faar
en BSOD istedet for et coredump, saa du kan se hvor det gaar galt. 

 >> 
>> Dette lille program beviser det:
>> 
>> #include <iostream> 
>> void main() 
>> { 
>>   int sum[2]; 
>>   for (int x=0;x<3;x++) 
>>     sum[x]=x; 
>>   for (int x=0;x<3;x++) 
>>     cout << x << endl;
>> }

> Det er heldigvis noget vrøvl - ellers var jeg da også blevet dybt rystet.

> Check dette program:

> #include <iostream> 
> int main() 
> { 
>   int sum[2]; int ged; 
>   ged = 0;
>   for (int x=0;x<3;x++) 
>     sum[x]=x; 
>   for (int x=0;x<3;x++) 
>     cout << "sum[x] : " << sum[x] << endl;
>   cout << "ged : " << ged << endl;
>   return 0;
> }

> Stort set dit, bortset fra at jeg har nogen navne på print, og den ekstra
> variabel "ged".

> Her er programmet, når man kører det med gcc på en linux maskine:

> nanna > uname && g++ -o tmp -Wall tmp.cc && ./tmp
> Linux
> ged : 0
> sum[0] : 0
> sum[1] : 1
> sum[2] : 2
> ged : 0

> Alt er tilsyneladende fint fint.

Naesten! Proev dette:

#include <iostream>

int sum[2]; int ged;

int main()
{
  ged = 0;
  for (int x=0;x<3;x++)
    sum[x]=x;
  for (int x=0;x<3;x++)
    cout << "sum[x] : " << sum[x] << endl;
  cout << "ged : " << ged << endl;
  return 0;
}

honspc05 /tmp > uname && a.out
Linux
sum[x] : 0
sum[x] : 1
sum[x] : 2
ged : 2
honspc05 /tmp > 


Det oprindelig program brugte lokale variable. Disse er allokeret paa stakken og ligger saledes:
(ikke helt korrekt, efter hukommelsen)

(hoeje adresser)
ramme (main) -> retur addresse
		gamle rammepeger
		sum[1]
		sum[0]
		ged
		x
stakpeger ->	...
(lave adresser)

Naar du skriver ud over arrayet oedelaegger du den gamle rammepeger, hvilket ikke goer saa meget da main er
oeverste funktion. Proev at skrive 4 istedet for 3, eller at goere det i en funktion f(), kaldt fra main, og
observer festfyrvaerkeriet... 

Hvis arrayet og ged er globale variable, saa ligger de allokeret omvendt i data sektionen :

sum[0] sum[1] ged

g++ -S er en guldgrube..

> Her er det samme program, oversat med gcc på en hpux maskine og kørt der:

> hermod > uname && g++ -Wall -o tmp.hpux tmp.cc && ./tmp.hpux
> HP-UX
> ged : 0
> sum[0] : 0
> sum[1] : 1
> sum[2] : 2
> ged : 2

> Det demonstrerer ret tydeligt at sum[2] og ged er det samme, eller rettere
> at når gcc kompileren ikke forsøger at lægge variablene ud så de passer
> til cache linie, eller hvad det nu er den foretager sig, så får man fejl -
> som i tilfældet med HPUX.

Grunden til denne opfoersel paa PH-UX skyldes at PA-RISC processoren er en af de faa der
opererer med en stak der gror opad istedet for nedad! (Hmm, det maa da egentlig betyde at bufferoverflows
kraever lidt mere fodarbejde for at faa til at virke paa HP-UX??)

-- 
Mvh Morten
 
Everyone is a genius.  It's just that some people are too stupid to realize it.
----------------------------------------------------------
email: sslug@sslug,sslug@sslug
addresse: Bergsøe Kollegiet v. 1105 2850 Nærum
----------------------------------------------------------



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *