首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个程序出现段异常,帮忙看一下

2013-06-26 
一个程序出现段错误,帮忙看一下。函数功能是将源字符串(域名)用.分割,返回倒数第二个字串。到了语句strcpy(a

一个程序出现段错误,帮忙看一下。
函数功能是将源字符串(域名)用.分割,返回倒数第二个字串。
到了语句  strcpy(arr[j],token);就出现段错误,怎么回事阿?

void parse_name(char *sour,char *dest)
{   
char seps[] = ".";
char *token;
int j=0;
char *arr[10];
   token = strtok( sour, seps );
   while( token != NULL )
   {
    arr[j]=(char *)malloc(512);
    strcpy(arr[j],token);
    j++;
     token = strtok( NULL, seps );
   }
   dest=arr[j-2];

}
[解决办法]
你的代码逻辑没问题,问题是你的参数传递有问题。
void parse_name(char *sour,char *dest)这样是不能传值的,要改成
void parse_name(char ×*sour,char *dest)使用指针的指针,因为指针在参数中只是一份拷贝
还有就是需要释放分配的多余内存。
[解决办法]
大致是这样的逻辑才对,另外注意一下内存释放的问题,free就需要自己处理了:


#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char* parse_name(char* sour)
{
char seps[] = ".";
char* token;
int j = 0;
char* arr[10];

token = strtok(sour, seps);
while(token != NULL)
{
arr[j] = (char*)malloc(512);
strcpy(arr[j], token);
j++;
token = strtok(NULL, seps);
}
return arr[j - 2];
}

int main(int argc, char* argv[])
{
char sour[] = "www.tom.com";
char* dest;

printf("%s\n", parse_name(sour));

return 0;
}

[解决办法]
出现段错误,从你现在给的代码中不能够看出来,错误出在了那里。但我猜,你的main函数里传递给sour的参数即实参可能是只读的。比如你定义成char *str = "www.baidu.com";如果你把str传给形参sour就会出现段错误。不过,这只是我的猜测。
还有,建议你的每次动态申请空间后,最好能够判断一下申请空间的情况,即判断是否申请成功,还有就是要手动释放,这个操作是必要的。
把所有代码主要是main函数的代码也贴出来吧,这样大家可能更好的帮你。

热点排行