| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1036 人关注过本帖
标题:Segmentation Fault
只看楼主 加入收藏
renzhe10
Rank: 1
等 级:新手上路
帖 子:6
专家分:7
注 册:2009-8-3
结帖率:100%
收藏
 问题点数:0 回复次数:2 
Segmentation Fault
题目所在的网址是http://acm.zju.
写的程序在 vs2008中无问题。但在 gcc中出现 Segmentation Fault错误。不知道是哪错了?
请教高手

本人的代码如下:

// cover.cpp
// 回溯法解决此问题。
// 将问题转换为区间的连续问题。
// 计算各子字符串在目标字符串中的区间,记录在record中。
// 对于子字符串在目标字符串中多次出现的情况,需要分别
// 记录。

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

// 区间的数据类型
struct pos
{
int left;
int right;
};


/* 读入目标字符串和子字符串,并将子字符串的区间写入record
* 下标从1 计,返回record的大小
*/
int readin(char *target, char **tile, struct pos *record)
{
// read in data
scanf("%s%*c", target);

int count;
scanf("%d%*c", &count);

int idofrcd = 0;
// build record
for (int i = 0; i < count; ++i)
{
scanf("%s%*c", tile[i]);
char *p = target;
while (true)
{
p = strstr(p, tile[i]);
if (p == NULL)
break;
idofrcd += 1; // 下标从1 计
record[idofrcd].left = p -target;
record[idofrcd].right = record[idofrcd].left + strlen(tile[i]) - 1;
p += 1;
}
}
return idofrcd;
}

// return true if ok
bool OK(struct pos *record, int *save, int k)
{
const int BEGIN = 0;

if (k == 1)
{
return (record[save[k]].left == BEGIN) ? true : false;

}
if (record[save[k]].left > record[save[k-1]].left &&
record[save[k]].left <= record[save[k-1]].right &&
record[save[k]].right > record[save[k-1]].right)
return true;
return false;
}

int deal(struct pos *record, int lenofrcd, int endoftrg)
{
//
int count = 0; // 记录解决方案的数量
int *save = (int *) calloc(50, sizeof(int));

int k = 1;
while ( k >= 1)
{
save[k] += 1;
//
while (save[k] <= lenofrcd && !OK(record, save, k))
save[k] += 1;

if (save[k] <= lenofrcd)
{
if (record[save[k]].right < endoftrg)
k += 1;
else if (record[save[k]].right == endoftrg)
count += 1;
}
else
{
save[k] = 0;
k -= 1;
}
}
free(save);
return count;
}


int main()
{
const int LEN_TRG  = 100; // 目标字符串的最大长度
const int LEN_TLE  = 50; // 子字符串的最大长度
const int COUNT_TLE = 50; // 子字符串的最大个数

int count = 0;
scanf("%d%*c", &count);

char target[LEN_TRG] = { 0 };

char **tile = (char **) calloc(COUNT_TLE, sizeof(char *));
tile[0] = (char *) calloc(COUNT_TLE * LEN_TLE, sizeof(char));
for (int i = 1; i < COUNT_TLE; ++i)
tile[i] = tile[i-1] + LEN_TLE;

struct pos *record = (pos *) calloc(COUNT_TLE, sizeof(pos));
//
while (count-- > 0)
{
int lenofrcd = readin(target, tile, record);
// 目标字符串最后一个字符的下标
int endoftrg = strlen(target) - 1;
int num = deal(record, lenofrcd, endoftrg);
printf("%d\n", num);

memset(tile[0], 0, COUNT_TLE * LEN_TLE);
memset(record, 0, COUNT_TLE * sizeof(pos));

}

free(tile[0]);
free(tile);
free(record);

return 0;
}
搜索更多相关主题的帖子: Segmentation Fault 
2009-11-30 20:25
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
比较复杂,我也没细看。
如果在 vc2008 上没问题的话。有可能是栈溢出错误(因为你说你用的是回溯算法)。你可以调试一下看看段错误是在哪个点发生的。
2009-12-20 09:58
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
段错误
一般都是非法内存操作,例如数组越界,例如申请a[5],却访问到a[5]或者a[6],这也会有很多情况,可能是循环操作时循环变量控制有问题,可能是字符串拷贝时长度发生溢出
指针指向了非法内存,例如申明一个指针,但是没有对指针进行初始化,直接就引用,或者引用里面的元素或者函数,或者没有分配内存就进行释放等,另外,申请内存还要检查是否申请成功,如果没有申请成功也会出现这种情况

单步调试或者加打印信息,细心一点总可以找到错误的,注意编译成调试版本
如果是linux,可以产生core文件,从core文件查看出错的地方

以上引用百度知道里的。
这可是个练习找虫的好机会,就留给你自己吧。
2009-12-21 00:12
快速回复:Segmentation Fault
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049595 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved