2016-11-05 2 views
-1

ich habe ein problem, dass ich nicht herausfinden kann, so hoffe ich, dass ihr mir helfen könnt. Ich schrieb ein Programm, um von dezimal in binär zu konvertieren und schreibe die Bits in ein Integer-Array, was gut funktioniert, bis ich ein paar printf-Anweisungen entferne. Da ich dachte, dass dies seltsam war und die printf-Anweisung entfernt die Logik nicht ändern des codes habe ich versucht das problem auf einer anderen maschine nachzubilden und dort funktioniert es wie man es mit und ohne printfs erwartet. Hier ist der Code:entfernen printf statment von code bricht programm

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

int main(){ 

int a; 
printf("input a number:\n"); 
scanf("%d",&a); 

int size=sizeof(a); 
size=size*8; 
printf("size in bits: %d\n",size); 


int *p; 
p=malloc(size); 


int i; 
for(i=0;i<size;i++){ 


    p[size-i-1]=a&0x1; 

    a=a>>1; 
} 

for(i=0;i<size;i++){ 

    printf("%d",p[i]); 
} 

printf("\n"); 

} 

wenn ich entferne die

printf("input a number:\n"); 

und

printf("size in bits: %d\n",size); 

Ich erhalte einen Fehler

a.out: malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.Aborted (core dumped) 

Wenn es hier hilft, ist der Ausgang von uname -a auf meinem machi ne

Linux aaaa 4.4.0-45-generiC#66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

und die Ausgabe von der anderen Maschine

Linux bernard-Inspiron-5558 3.13.0-95-generiC#142-Ubuntu SMP Fri Aug 12 17:00:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 

meine gcc Version

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 

und der andere

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 

dies etwas hat mit dem zu tun gcc, das OS, oder mache ich etwas g falsch im Code?

Antwort

4

Ja, Sie fragen nicht nach genügend Speicher.

int *p; 
p=malloc(size); // size in bytes 

int i; 
for(i=0;i<size;i++){ 
    p[size-i-1]=a&0x1; // size - 1 ints. 
    a=a>>1; 
} 

Sie müssen genug Speicher für Größe Ints malloc. I.e.

malloc(size * sizeof(int)); 

Das Schreiben über den zugewiesenen Speicher ist nicht definiert.