2017-01-18 4 views
0

Ich habe die Aufgabe, eine zufällige natürliche Zahl zu nehmen und die collatz-Vermutung von der letzten Zahl zum Eingang auszudrucken. Die Schritte zur Collatz-Vermutung sind: (a) Beginnen Sie mit irgendeiner positiven ganzen Zahl N. (b) Wenn N ungerade ist, multiplizieren Sie es mit 3 und addieren Sie 1. (dh N ← 3N + 1) (c) Wenn N ist gerade, dividiere es durch 2. (dh N ← N/2) (d) Wiederholen. und es endet immer in 4 -> 2-> 1-> 4-> 2-> 1 ... Mein Computer sagt mir, dass (Projektname) .exe funktioniert nicht mehr nach Eingabe der Ganzzahl.Realloc, dynamische Speicherzuweisung

Der wichtigste Punkt ist wahrscheinlich, dass wir Platz für die Vermutung reservieren und es verdoppeln sollten, wenn es vollständig verwendet wird.

mein Code:

int main() 
{ 
unsigned long int input =0; 
int max =16; 
long int *collatz; 
collatz = malloc(max*sizeof(long int)); 
long int *n = NULL; 
long int *u = NULL; 
int counter=0; 

printf("Please enter a natural number:"); 
scanf("%lu", input); 
printf("%lu\n",input); 
if (input <1) 
{ 
    printf ("ERROR, not a natural number"); 
    return 1; 
} 

n = collatz; 
*n = input; 

while (*n!=1) 
{ 
    if (counter == max) 
    { 
     max = max*2; 
     collatz = realloc (collatz,max*sizeof(long int)); 
    } 

    if ((*n)%2 == 1) 
    { 
     *n=(3*(*n))+1; 
    } 
    else if ((*n)%2 == 0) 
    { 
     *n=(*n)/2; 
    } 
    *u=*n; 
    n=n+1; 
    *n=*u; 
    counter++; 
    int *i =0; 
    for (i=n;*i!=input;i--) 
    { 
     printf("%lu\t",*i); 
    } 
} 
return 0; 
} 

Ich glaube, ich habe die realloc falsch, die meisten anderen Sachen ist kein großes Geheimnis für mich (das dort nicht bedeuten, sind keine Fehler, thereprobably sind).

Danke für Ihre Hilfe!

+0

Tun Sie niemals 'x = realloc (x, ...);' – 0andriy

+0

warum? Wir wurden ermutigt, es zu benutzen ... @ 0andriy –

+0

Denken Sie nur darüber nach. Es ist leicht zu beheben. Dein Code enthält momentan einen ernsthaften Fehler. – 0andriy

Antwort

0

Der Fehler tritt auf der scanf().

$ echo 4 | ./a.out 
ASAN:DEADLYSIGNAL 
================================================================= 
==3684==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x7f37ae1007fe bp 0x7fffb3148b60 sp 0x7fffb3148480 T0) 
==3684==The signal is caused by a WRITE memory access. 
==3684==Hint: address points to the zero page. 
    #0 0x7f37ae1007fd in _IO_vfscanf (/lib/x86_64-linux-gnu/libc.so.6+0x5c7fd) 
    #1 0x7f37ae10f72f in __isoc99_vscanf (/lib/x86_64-linux-gnu/libc.so.6+0x6b72f) 
    #2 0x433206 in __interceptor___isoc99_vscanf /home/development/llvm/3.9.0/final/llvm.src/projects/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:1187:1 
    #3 0x433206 in __interceptor___isoc99_scanf /home/development/llvm/3.9.0/final/llvm.src/projects/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:1208 
    #4 0x4e4954 in main /home/brian/tmp/collatz/coll.c:15:5 
    #5 0x7f37ae0c482f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f) 
    #6 0x418dc8 in _start (/home/brian/tmp/collatz/a.out+0x418dc8) 

AddressSanitizer can not provide additional info. 
SUMMARY: AddressSanitizer: SEGV (/lib/x86_64-linux-gnu/libc.so.6+0x5c7fd) in _IO_vfscanf 
==3684==ABORTING 

Außerdem habe ich Warnungen, wenn zu kompilieren versuchen, diese schauen, wie sie das Problem identifizieren helfen können:

$ clang -fsanitize=address -g coll.c 
coll.c:15:18: warning: format specifies type 'unsigned long *' but the argument has type 'unsigned long' [-Wformat] 
    scanf("%lu", input); 
      ~~~ ^~~~~ 
coll.c:47:15: warning: incompatible pointer types assigning to 'int *' from 'long *' [-Wincompatible-pointer-types] 
     for (i=n;*i!=input;i--) 
       ^~ 
coll.c:49:28: warning: format specifies type 'unsigned long' but the argument has type 'int' [-Wformat] 
      printf("%lu\t",*i); 
        ~~~ ^~ 
        %d 
3 warnings generated. 

Nach scanf() Fixierung kann ich immer noch ein Laufzeitfehler sehen auf der auftretende *u=*n Linie . Sie sollten einen Debugger starten, um dieses Problem zu sehen.

+0

vielen Dank! –

Verwandte Themen