2016-09-04 3 views
-3

Das Problem ist der Linksrotation in Array.Warum Segmentierungsfehler im folgenden C-Code?

Die erste Zeile enthält zwei durch Leerzeichen getrennte ganze Zahlen, die die entsprechenden Werte n (die Anzahl der ganzen Zahlen) und d (die Anzahl der Linksdrehungen, die Sie ausführen müssen) angeben. Die zweite Zeile enthält n durch Leerzeichen getrennte Ganzzahlen, die die jeweiligen Elemente des Ausgangszustands des Arrays beschreiben.

Meine Lösung:

#include <stdio.h> 
#include <malloc.h> 

int main() { 
    int n, d, i; 
    scanf("%d %d", &n, &d); 
    int *a = (int *)malloc(sizeof(int) * n); 
    int *temp = (int *)malloc(sizeof(int) * d); 
    for (i = 0; i < n; i++) 
     scanf("%d", &a[i]); 
    for (i = 0; i < d; i++) 
     temp[i] = a[i]; 
    for (i = 0; i < n - d; i++) 
     a[i] = a[i + d]; 
    for (i = 0; i < n; i++) 
     a[i + n - d] = temp[i]; 
    for (i = 0; i < n; i++) 
     printf("%d ", a[i]); 
    return 0; 
} 
+0

Sie ignorieren den Rückgabewert von 'scanf'; ein fataler logischer Fehler. –

+1

Was ist die Eingabe? Sie erhalten immer SIGSEGV wenn d> n. – 4pie0

+1

Verwenden Sie einen Debugger. Verwenden Sie debug printfs. Lernen Sie grundlegende Debugging-Techniken (das sofortige Veröffentlichen auf SO ist keine großartige Debugging-Technik, obwohl viele Leute davon ausgehen, dass sie dies tun). Und bitte wählen Sie nur die relevanten Sprach-Tags aus. C und C++ sind nicht die gleiche Sprache. – kaylum

Antwort

0

Ihr Code hat einige Probleme.

Zuerst machte man implizite Behauptungen im Code

for(i=0;i<n;i++) 
    scanf("%d",&a[i]); 
for(i=0;i<d;i++) 
    temp[i]=a[i]; 
      ^
     d should be <= n 

, die falsch sind: wenn d > n Sie einen Lesezugriff aus einer zugeordneten Zone zu tun.

Das gleiche Problem in

for(i=0;i<n;i++) 
    a[i+n-d]=temp[i]; 
    ^  ^
2*n-d <= n and n <= d 
    n >= d for i = 0 

Der Code vor den malloc Anrufe sollten Sie d = n unter der Bedingung

if (n > 0 && d > 0 && n < ... && d < ...) 

Ich denke, ausgeführt werden, schreiben die erste Version des Algorithmus annehmen kann.

0

Der Code schlägt immer fehl, wenn d > n, aber es funktioniert nicht auch, wenn d < n: die vierte for Schleife falsch ist, es bei d aufhören sollte:

for (i = 0; i < d; i++) 
    a[i + n - d] = temp[i];