windows - C hukommelsespørgsmål

Indlæg af Hanne Mølgaard Plasc

Problem



char buffer[10];
strcat(buffer, "hi");
printf("\%s", buffer);


I ovennævnte kode udskriver det noget underligt symbol eller nummer efterfulgt af 'hej', jeg ved, at strcat tilføjer buffer. Og jeg nulstiller normalt hukommelsen i buffer. Men jeg er nysgerrig, hvorfor jeg normalt skal gøre det.


Hvis jeg gør printf("\%i", buffer); uden strcat, udskriver det blot et tilfældigt tal. Hvad er det nummer? Kan nogen forklare eller linke til en tut, der forklarer, hvad der er i buffer, før jeg udfylder det med noget?

Bedste reference


'buffer' er en 10 byte region på stakken, og den indeholder alt, hvad der sidst var skrevet til den pågældende region af hukommelse. Når du strcat, ville det sammenkæde 'hi' efter den første null byte i den region (Så hvis den første null byte er ud over 10 bytes, du 'overskriver noget på stakken). Når du udskriver uden nulstilling, 'd udskriver byterne til den første 0 (null). Igen kan dette udskrive ud over 10 bytes.


Når du udskriver (\% I, buffer), udskriver du adressen på den pågældende placering.

Andre referencer 1


Først skal du nul-init buffer:


char buffer[10] = {0};
buffer[0] = 0; /* As R.. points out, initializing all elements is excessive. */


For det andet er tallet adressen til buffer, som en decimal. Hvis du virkelig vil udskrive det, har du det bedre at udskrive:


printf("\%p
", buffer);

Andre referencer 2


Du har brug for en opsigelse '\ 0' for at markere slutningen af ​​strengen,
brug


strcpy(buffer,"hi");


strcat () forsøger at tilføre en allerede eksisterende streng, som antages at være '\ 0' afsluttet. Din buffer er ikke initialiseret.

Andre referencer 3


gør en memset(buffer, 0, 10) for at nulstille hukommelsen først, før du tilføjer.

Andre referencer 4



  Funktionen strcat () tilføjer src-strengen til dest
         streng, overskriver nullbyte ('\ 0') i slutningen af ​​dest,
         og tilføjer derefter en terminerende null byte. Strengene må ikke
         overlappe hinanden og dest strengen skal have plads nok til
         resultat.



buffer er ikke '' afsluttet, da den ikke initialiseres, ved vi ikke, hvad den indeholder. Derfor er det en udefineret adfærd. Du skal først sørge for, at bufferen er '\ 0' afsluttet.


Og det trykte nummer er ikke et tilfældigt tal, det er startadressen til bufferen.