2016-11-05 3 views
-1

У меня проблема, которую я не могу понять, поэтому надеюсь, вы, ребята, можете мне помочь. Я написал программу ac для преобразования из десятичной в двоичную и записал биты целочисленного массива, который отлично работает до тех пор, пока я не удалю пару операторов printf. Поскольку я думал, что это было странно, и удаление инструкции printf не изменяет логику кода я попытался воссоздать проблему на другой машине, и там она работает так, как можно было бы ожидать с и без printfs. Вот код:удаление printf statment из программы разрывов кода

#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"); 

} 

когда я удалить

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

и

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

я получаю сообщение об ошибке

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) 

Если это помогает здесь выход от uname -a на моей мачи пе

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 

и выход из другой машины

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 

мой НКУ версия

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

, а другой один

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

это имеет какое-то отношение gcc, ОС, или я что-то делаю g неправильно в коде?

ответ

4

Да, вы не просите достаточно памяти.

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; 
} 

Необходимо иметь достаточное количество памяти для больших объемов данных. То есть

malloc(size * sizeof(int)); 

Записывание выделенной памяти является неопределенным поведением.