2017-05-30 5 views
1

ist ich einige einfache Code in C wurde writting eine Speicherzuweisung und Zeiger zu testen:Valgrind zeigt mehr Speicher zugewiesen, als tatsächlich

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


    int *randomAlloc(int n) { 
     int *address = NULL, i = 0; 

     address = malloc (n * sizeof(int)); 
     for (i = 0; i < n ; i++){ 
      *(address + i) = i ; 
     } 
     return address; 

    } 

    int main(int argc, char* argv[]) { 

     int *address; 
     int n; 
     printf("Type vector size: "); 
     scanf("%d", &n); 
     address = randomAlloc(n); 

     free(address); 
    } 

Doch aus irgendeinem Grund, wenn ich 4 als Eingabe valgrind Ausgänge Typ:

==2375== Memcheck, a memory error detector 
    ==2375== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
    ==2375== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info 
    ==2375== Command: ./a.out 
    ==2375== 
    Type vector size: 4 
    ==2375== 
    ==2375== HEAP SUMMARY: 
    ==2375==  in use at exit: 0 bytes in 0 blocks 
    ==2375== total heap usage: 3 allocs, 3 frees, 2,064 bytes allocated 
    ==2375== 
    ==2375== All heap blocks were freed -- no leaks are possible 
    ==2375== 
    ==2375== For counts of detected and suppressed errors, rerun with: -v 
    ==2375== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Es gibt nur einen Alloc und einen freien Code. Als n = 4 würde ich erwarten, dass es 4 * 4 (sizeof (int)) = 16 Bytes zuweist. Woher kommt das?

+0

Typ '1' oder' 2' ... es wird immer noch dasselbe sein. Die einzige Sache, die es ändert, ist '2.064 Bytes zugeteilt'. Werfen Sie einen Blick und überlegen Sie, warum. – Michi

+0

Ich kann das beschriebene Verhalten nicht reproduzieren. Wenn ich Ihren Code unter Valgrind erstellen und ausführen, meldet er eine Zuteilung und eine frei, wie Sie es erwarten. –

+0

@JohnBollinger Nicht auf meinem System (Linux Mint). Wenn ich '2' eintippe, habe ich:' Gesamt-Heap-Nutzung: 3 Allocs, 3 Freigaben, 2.056 Bytes allocated' wenn ich '3' schreibe, habe ich:' Gesamt-Heap-Nutzung: 3 Allocs, 3 Frees, 2.060 Bytes allocated' .. ... und so weiter. '2,056' =>' 2,060' => '2064' – Michi

Antwort

3

Valgrind verfolgt alle Speicherzuordnungen, die in Ihrer Anwendung auftreten, einschließlich solche, die intern von der C-Bibliothek vorgenommen werden. Es ist nicht (und kann nicht) auf Zuweisungen beschränkt, die Sie explizit vornehmen, da die C-Bibliothek Zeiger auf den Speicher zurückgeben kann, den sie intern zugewiesen hat.

Viele Standard-I/O-Implementierungen weisen Puffer für die Verwendung durch printf() und/oder zu, was wahrscheinlich für die Zahlen steht, die Sie sehen.

0

Ausführen dieses Code ohne scanf oder printf:

int *randomAlloc(int n) { 
     int *address = NULL, i = 0; 

     address = malloc (n * sizeof(int)); 
     for (i = 0; i < n ; i++){ 
      *(address + i) = i ; 
     } 
     return address; 

    } 

    int main(int argc, char* argv[]) { 
     int *address; 
    // int n; 
    // printf("Type vector size: "); 
     address = randomAlloc(10); 

     free(address); 
    } 

Outputed auf valgrind nur der Speicher explizit zugeordnet. Printf und Scanf waren definitiv der Grund für diese zusätzlichen Zuweisungen.

Verwandte Themen