2016-04-09 15 views
-1
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 


void print(int *iArray,int limit) 
{ 

int counter=0; 

while(counter<limit) 
printf("%d ",iArray[counter++]); 

printf("\n"); 
} 

int main() 

{ 

int counter=0; 
int *iArray=NULL; 
char str[5]="abc"; 
printf("Enter numbers : "); 

while(1){ 
scanf("%s",str); 
if(strcmp(str,"s")==0) break; 
iArray=realloc(iArray,counter+1); 
iArray[counter++]=atoi(str); 
} 
print(iArray,counter); 
return 0; 
} 

nachdem diese Zahlen mit Sequenz Einfügen: 235,225,2,2,2,365,11,2Warum Fehler für Realloc? Fehler abgebrochen (core dumped)

gibt es folgende Fehler

*** Error in `./a.out': realloc(): invalid next size: 0x0000000000c14010 *** 
Aborted (core dumped) 
+1

Formatierung/Vertiefung .. :( –

+1

Das Einrücken ist immer noch Müll OP sollte es aufzuräumen und seine Debugger, um den Wert von ‚Zähler‘ und sehen, wie viel Platz es ist eigentlich folgen wieder./allocating –

+0

@ user1320881 Keine Zuweisung erforderlich, realloc (N ULL, Größe) entspricht Malloc (Größe). – Jens

Antwort

1

Veränderung dieser:

iArray=realloc(iArray,counter+1); 

dazu:

iArray=realloc(iArray,(counter+1)*sizeof(*iArray)); 

da müssen Sie sagen, um Speicherplatz von welcher Größe zuzuteilen. In Ihrem Code haben Sie counter + 1 Speicherplatz zugewiesen. Von was? Nun, mit meinem Vorschlag vergeben Sie counter + 1 mal die Größe von wo iArray zeigt auf (ein int), was mehr Sinn macht, oder? ;)


Überprüfen Sie die ref:

die Größe des Blocks zeigte Speicher Änderungen an durch ptr.

Die Funktion kann den Speicherblock an einen neuen Speicherort verschieben (dessen Adresse von der Funktion zurückgegeben wird).

Der Inhalt des Speicherblocks bleibt bis auf den kleineren Wert von neuen und alten Größen erhalten, auch wenn der Block an eine neue Position verschoben wird. Wenn die neue Größe größer ist, ist der Wert des neu zugewiesenen Teils unbestimmt.

PS: Formatieren Sie das nächste Mal Ihren Code.

+0

Ich möchte Grund des Fehlers wissen. @gsamaras – jasonjpq

+0

Wie ich in meiner Antwort @jasonjpq sagte, mit Ihrem Code nicht genügend Speicherplatz zuweisen. Sie ordnen 1 Byte zum Beispiel in der ersten Iteration zu, während Sie mehr zuweisen sollten, wie meine Antwort sagt. – gsamaras

+0

Warum funktioniert es gut, wenn ich gebe: 10,20,30,40,50,60? @gsamaras – jasonjpq

0

Das liegt daran, dass realloc() bei jeder Iteration nur ein Byte mehr als den Wert count zuweist. I.e. In der allerersten Iteration ordnen Sie ein Byte zu. Aber dann speichern Sie das Ergebnis von atoi(), das die Größe eines int ist.

+0

Warum funktioniert es gut, wenn ich gebe: 10,20,30,40,50,60? @Jens – jasonjpq

+0

haben Sie Reallocs Dokumentation auschecken? @jasonjpq – fluter

+1

@jasonjpq Es funktioniert nicht gut. Es überschreibt nicht zugeordneten Speicher. Es passiert einfach, dass es nicht sofort zu lautem Versagen führt. – Jens

1

Blick auf den Prototyp von realloc:

void *realloc(void *ptr, size_t size); 

seine zweite arg ist Größe, in Bytes, und Sie werden eine Reihe von ganzen Zahlen Zuteilung, müssen Sie die Größe des gesamten Arrays, nicht die Anzahl der Elemente verwenden sie stattdessen:

iArray=realloc(iArray, (counter+1) * sizeof(int)); 
+0

das scheint korrekt zu sein iArray = realloc (iArray, (Zähler + 1) * sizeof (int)); Was halten Sie von iArray = Realloc (iArray, (Zähler + 1) * sizeof (* iArray)); oben erwähnt von gsamaras es nicht mit realloc (nicht mit realloc neu zuweisen) als sizeof (* iArray) ist außerhalb der Funktion @fluter – jasonjpq

+0

sie sind die gleiche Sache, da sizeof ist ein Operator, der die Größe in Bytes seines Operanden ergeben, und ist in der Vorverarbeitungsphase verarbeitet, so sind hier sizeof (int) und sizeof (* iArray) dasselbe. @jasonjpq – fluter

+0

thanx @fluter half es – jasonjpq