2014-10-23 4 views
0

Я относительно новичок в программировании (несколько месяцев), и я пытаюсь решить некоторые проблемы USACO. Когда я представил свою программу, он сказал следующее:Ошибка сегментации - сигнал 11

Run 1: Execution error: Your program (`palsquare') exited with signal #11 (segmentation violation [maybe caused by accessing memory out of bounds, array indexing out of bounds, using a bad pointer (failed open(), failed malloc), or going over the maximum specified memory limit]). The program ran for 0.005 CPU seconds before the signal. It used 2168 KB of memory.

Я не могу найти разыменованные нулевые указатели, которые я изначально думал, была проблемой.

Вот мой код (я программировал на языке C)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <assert.h> 
#include <ctype.h> 
#include <math.h> 

int ispal(char *square) 
{ 
    char *temp; 

    temp = square + strlen(square) - 1; 
    for(temp = square + strlen(square) - 1; square < temp; square++, temp--) 
    { 
     if(*square != *temp) 
      return 0; 
    } 
    return 1; 
} 

void convert(char *square, int n, int base) 
{ 
    int len; 

    if(n == 0) 
    { 
     square = ""; 
     return; 
    } 

    convert(square, n/base, base); 

    len = strlen(square); 
    square[len] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n % base]; 
    square[len + 1] = '\0'; 
} 

int main() 
{ 
    char square[100]; 
    char temp[100]; 
    int i, base; 
    FILE *fin, *fout; 

    fin = fopen("palsquare.in", "r"); 
    fout = fopen("palsquare.out", "w"); 

    fscanf(fin, "%d", &base); 
    for(i = 1; i <= 300; i++) 
    { 
     convert(square, i * i, base); 
     if(ispal(square)) 
     { 
      convert(temp, i, base); 
      fprintf(fout, "%s %s\n", temp, square); 
     } 
    } 

    return 0; 
} 
+0

Выполняется ли программа на вашей собственной машине? Вы пробовали valgrind или отладчик? –

+0

Нет, программа выходит из строя, и я не знаю, как использовать отладчик Dev C++ (опять же, я довольно новый: P) – user1293841284

+0

Используйте 'strcpy()' для назначения строк, а не 'square =" "'. – Barmar

ответ

0

С square = "", вы изменяете значение переменной square, чтобы указывать на пустую строку.

Поскольку эта переменная локальна в функции convert, ее изменение не действует вне функции.

Если вы хотите установить указанные данные в пустую строку, вместо этого используйте square[0] = '\0'.


Кстати, даже если это имело эффект вне зависимости каким-то образом (например, если вы использовали глобальную переменную вместо локальной переменной), то не только бы это не решит проблему, но также ухудшат ситуацию:

  1. Эта переменная будет указывать на строку, выделенную в сегменте памяти с правом доступа только для чтения.
  2. Эта переменная укажет на массив символов, выделенных в памяти размером одного символа.

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

+0

'' \ 0'' - более ясный способ написать '0', на мой взгляд, чтобы подчеркнуть, что это строка, которая заканчивается. – unwind

+0

@unwind: согласился :) –

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