2016-07-04 17 views
3

Ich möchte zuerst eine int* mit der Größe 10 erstellen und eine add()-Funktion schreiben, um Elemente hinzuzufügen. Wenn die Anzahl der Elemente größer als 10 ist, verwendet die Funktion realloc(), um die Größe des int* zu ändern. Allerdings habe ich die Fehlermeldung erhalten. Wie kann ich das verbessern?Probleme bei der Verwendung von realloc() in einer Funktion zum Ändern der Größe des int-Zeigers

Hier ist, was ich getan habe:

int main() 
{ 
    int size = 10; 
    int* a; 
    a = (int*)malloc(size*sizeof(int*)); 
    int i; 
    double start, stop; 
    start = clock(); 

    for (i = 0; i < 100000; i++){ 
     add(&a, i, size, i); 
    } 

    stop = clock(); 
    printf("Adding arry by one: %10.2f\n", stop - start); 

    return 0; 
} 


void add(int *a, int element, int size, int index) 
{ 
    if (index < size) 
    { 
     a[index] = element; 
    } 
    else if (index >= size) 
    { 
     a = realloc(a, sizeof(int*)*(index + 1)); 
     a[index] = element; 
    } 
} 
+5

'void add (int * a,' getan werden - > 'void add (int ** a,', '* a = realloc (* a, sizeof (int) * (index + 1));', (brauchen Update-Größe?) – BLUEPIXY

+0

@BLUEPIXY Obwohl ungewöhnlich, die 'realloc 'Wird auf' index' gemacht (was aufsteigend gemacht wird) und nicht 'size' (was behoben ist), also ist es" okay "[wenn nicht optimal] –

+1

Sie können kein' int * 'mit einer Größe von 10 machen Sie können jedoch einen "int *" - Punkt auf einen Speicherblock mit einer Größe von 10 Ints setzen. – immibis

Antwort

2

Ihr Zeiger a ein Parameter der Funktion add ist. Parameter sind nur lokale Variablen in dieser Funktion. Wenn Sie also a = realloc (...) zuweisen, wird das a in der aufrufenden Funktion nicht geändert. Dies wird ziemlich schnell abstürzen. Die Größe wird ebenfalls nicht angepasst - wenn Sie ein Element bei Index 17 und dann bei Index 12 hinzugefügt haben, wird Ihr Array auf 13 Elemente skaliert.

Sie können die BLUEPIXY-Lösung verwenden. Ich würde es vorziehen, eine Struktur zu erstellen, die einen Zeiger und eine Größe enthält, diese umzuleiten und den Code aktualisieren zu lassen. Vermeidet viele ** s; Sie sind nicht gut für dein Gehirn :-)

0

Sie müssen den int * a Parameter zu int ** a ändern. Ich habe einige Änderungen an der Struktur vorgenommen:

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

#define SIZE 10 

void add(int**a, int element, int size, int index) { 
    if (index >= size) { 
    *a = realloc(*a, sizeof(int)*(index + 1)); 
    } 
    (*a)[index] = element; 
} 

int main() { 
    int *a = malloc(SIZE*sizeof(int)); 
    double start, stop; 

    start = clock(); 

    for (int i = 0; i < 100000; i++) { 
    add(&a, i, SIZE, i); 
    } 

    stop = clock(); 

    printf("Adding arry by one: %10.2f\n", stop - start); 

    free(a); 

    return 0; 
} 
0

Malloc und realloc sollte für die Größe der (int) nicht für die Größe der (int *)