2015-01-20 2 views
-1

У меня есть фрагмент кода, который вычисляет координаты из заданного пользователем размера сетки и печатает их в текстовом файле. Однако, когда я запускаю программу, я получаю ошибку сегментации, но только для значений 5 или 7 для сетки, все остальные значения работают по назначению.C - Ошибка сегментации для выбранных значений fprintf

Код выглядит следующим образом

// Writing OUTPUT 1 to file 
// Creating & opening file 
FILE *f1 = fopen("coords_output.txt", "w"); 
if(f1 == NULL) 
{ 
    printf("Error in opening file\n"); 
    exit(0); 
} 
// Writing to file 
for(i=0; i < arrayLength; i++) 
{ 
    for(j=0; j < arrayLength; j++) 
    { 
     fprintf(f1, "\n%d,%d %d", i, j, coordArray[i][j]); 
    } 
} 
// Close file 
fclose(f1);here 

Если целый раздел под // запись в файл удаляется программа работает, и независимо от того, что я размещаю там программа не будет выполнена.

У меня нет большого понимания c, особенно когда дело касается таких областей, однако я потратил много времени на то, чтобы исправить эту проблему и, похоже, не мог прийти к ответу.

EDIT: coordArray определяется как

coordArray = malloc(arrayLength * sizeof(int *)); 
for(i=0; i <= arrayLength; i++) 
{ 
    coordArray[i] = malloc(arrayLength * sizeof(int)); 
} 

arrayLength берется из пользовательского ввода

validInput = validInput && sscanf(argv[1], "%d", &arrayLength); 
+3

Как произносится 'coordArray'? –

+1

Нам нужен еще код, также, вы пробовали отладчик? –

+0

по крайней мере 'coordArray' и' arrayLength' – technosaurus

ответ

0

Этот код не работает (с изменениями от кода, в комплект поставки):

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    int arrayLength = 5; 
    int i,j; 
    int **coordArray; 
    coordArray = malloc(arrayLength * sizeof(int *)); 
    for(i=0; i <= arrayLength; i++) 
    { 
     coordArray[i] = malloc(arrayLength * sizeof(int)); 
    } 
    for(i=0; i < arrayLength; i++) 
    { 
     for(j=0; j < arrayLength; j++) 
     { 
      printf("\n%d,%d %d", i, j, coordArray[i][j]); 
     } 
    } 
    return 0; 
} 

Это не работает, потому что первый цикл for является обработка 1 за пределами массива. Несмотря на то, что он может работать, код нарушается независимо от значения arrayLength. Причина, по которой она может работать для некоторых значений, связана с тем, как возникают сбои сегментации, в Интернете есть много ресурсов о том, когда и почему они происходят, вот random one, который, кажется, хорошо объясняет это.

Этот код работает (обратите внимание на переход от <= к < в первом for цикле):

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    int arrayLength = 5; 
    int i,j; 
    int **coordArray; 
    coordArray = malloc(arrayLength * sizeof(int *)); 
    for(i=0; i < arrayLength; i++) 
    { 
     coordArray[i] = malloc(arrayLength * sizeof(int)); 
    } 
    for(i=0; i < arrayLength; i++) 
    { 
     for(j=0; j < arrayLength; j++) 
     { 
      printf("\n%d,%d %d", i, j, coordArray[i][j]); 
     } 
    } 
    return 0; 
} 

Это может быть трудно найти ошибки, как это без использования отладчика или инструмент для анализа, как Valgrind. Я настоятельно рекомендую вам потратить время, чтобы узнать, как использовать такие инструменты, чтобы вы могли найти источник этих ошибок в будущем.

Смежные вопросы