分段故障 - 信号11

时间:2014-10-23 04:39:52

标签: c segmentation-fault

我相对较新的编程(几个月)并且正在尝试一些USACO问题。 当我提交我的程序时,它说:

  

运行1:执行错误:您的程序(“palsquare'”)退出           信号#11(分段违规[可能由访问引起)           内存越界,数组索引越界,使用坏           指针(失败的open(),malloc失败)或超过最大值           指定的内存限制])。该程序运行0.005 CPU秒           在信号之前。它使用了2168 KB的内存。

我无法找到任何解除引用的空指针,我最初认为这是问题所在。

这是我的代码(我用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] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[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;
}

1 个答案:

答案 0 :(得分:0)

使用square = "",您将变量square的值更改为指向空字符串。

由于此变量在函数convert中是局部变量,因此更改它在函数外部无效。

如果要将指向数据设置为空字符串,请改用square[0] = '\0'


顺便说一句,即使它确实在函数之外产生了影响(例如,如果你使用了全局变量而不是局部变量),那么它不仅不会解决问题,而且还会产生一些问题糟糕的是:

  1. 此变量将指向一个字符串,该字符串在具有只读访问权限的内存段中分配。
  2. 此变量将指向一个字符数组,在内存中分配给单个字符的大小。
  3. 由于这些事实中的每一个单独,任何尝试更改此变量指向的内存地址及其周围的内容都很可能在运行时产生内存访问冲突。