C 分段故障——信号11
我对编程比较陌生(几个月),正在尝试一些USACO问题。 当我提交我的计划时,它说: 运行1:执行错误:您的程序(`palsquare')已退出 信号#11(分段冲突[可能由访问引起 内存超出范围,数组索引超出范围,使用错误的 指针(失败的open()、失败的malloc)或超过最大值 指定的内存限制])。程序运行了0.005 CPU秒 在信号之前。它使用了2168 KB的内存 我找不到任何取消引用的空指针,我最初认为这是问题所在 这是我的代码(我用C语言编程)C 分段故障——信号11,c,segmentation-fault,C,Segmentation Fault,我对编程比较陌生(几个月),正在尝试一些USACO问题。 当我提交我的计划时,它说: 运行1:执行错误:您的程序(`palsquare')已退出 信号#11(分段冲突[可能由访问引起 内存超出范围,数组索引超出范围,使用错误的 指针(失败的open()、失败的malloc)或超过最大值 指定的内存限制])。程序运行了0.005 CPU秒 在信号之前。它使用了2168 KB的内存 我找不到任何取消引用的空指针,我最初认为这是问题所在 这是我的代码(我用C语言编程) #包括 #包括 #包括 #包括
#包括
#包括
#包括
#包括
#包括
#包括
int ispal(字符*正方形)
{
字符*温度;
温度=方形+标准(方形)-1;
用于(温度=平方+标准(平方)-1;平方<温度;平方++,温度--)
{
如果(*平方!=*温度)
返回0;
}
返回1;
}
无效转换(字符*正方形、整数n、整数基)
{
内伦;
如果(n==0)
{
正方形=”;
返回;
}
转换(正方形,n/基,基);
len=strlen(正方形);
方形[len]=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”[n%基];
正方形[len+1]='\0';
}
int main()
{
焦方[100];
炭温度[100];
int i,基础;
文件*fin,*fout;
fin=fopen(“方英寸”、“r”);
fout=fopen(“palsquare.out”,“w”);
fscanf(fin、%d、&base);
对于(i=1;iWithsquare=“
),您正在更改变量square
的值以指向空字符串
由于此变量在函数convert
中是局部变量,因此在函数之外更改它不会产生任何影响
如果要将指向的数据设置为空字符串,请改用square[0]='\0'
顺便说一句,即使它确实以某种方式在函数之外产生了影响(例如,如果使用全局变量而不是局部变量),那么它不仅不能解决问题,而且还会使事情变得更糟:
此变量将指向在具有只读访问权限的内存段中分配的字符串
此变量将指向一个字符数组,该数组在内存中分配为单个字符的大小
由于这些事实中的每一个都是独立的,任何试图更改此变量指向的内存地址及其周围内容的尝试都很可能在运行时产生内存访问冲突。程序是否在您自己的计算机上运行?您是否尝试过valgrind或调试器?不,程序崩溃,我没有知道如何使用Dev C++的调试器(同样,我是新手:P)使用strcpy()
分配字符串,而不是square=“”
@WhozCraig因为他在任务完成后立即返回,所以从那一点上看没有任何问题on@Barmar呃。没有看到回报。谢谢你让我保持诚实。而且*square=0;
似乎比使用strcpy要简单得多strcpy
。“\0”
在我看来是一种更清晰的方式来编写0
请确定它是一个正在终止的字符串。
#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;
}