QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 707|回复: 8

请帮忙

[复制链接]
发表于 2004-7-29 16:20:27 | 显示全部楼层 |阅读模式
各位,大家好,请帮忙,我在编程序的时候出现了段错误  
用gdb调试说错误的语句为ret[curp]=bin[j];
其中,ret为一个动态数组,curp为当前指针,bin为一个8位的数组,j为bin的指针
,谢谢  
发表于 2004-7-29 16:23:11 | 显示全部楼层
能更详细点吗?最好有代码。
回复

使用道具 举报

 楼主| 发表于 2004-7-29 16:28:52 | 显示全部楼层
//编写这个程序是为了将一个十进制表示的IP 地址用二进制存储
  [code:1]                                                                                                                                            
#include <string.h>
//char *dectobin(char *s);
                                                                                                                                             
int main(int argc,char *argv[])
{
                                                                                                                                             
        int i;//用来表示当前字符串的位置
        int num;//用来表示当前取到的数
        int j,curp,temp,len,k;/*j用于将十进制数转换成二进制数时的当前位curp表示转换成
数字符串的当前位置temp用来存放这个数转换成的二进制的位数*/
        char c;
        char bin[8];//用来存放一个八位二进制数
        char *ret;//用来存放转换成的二进制字符串
        curp=0;
        i=0;
        len=strlen(argv[1]);
        while(i<len)
        {
                num=0;
                c=argv[1][i];
                while(c!='.'&i<len)
                {
                        num=num*10;
                        num=num + (int)c-48;
                        i++;
                        c=argv[1][i];
                }
                if(c=='.')
                        i++;
                j=0;
                while(num!=0)
                {
                        bin[j]=num %2 + 48;
                        num=num/2;
                        j++;
                }
                while(j<8)//判断当前二进制位数是否达到8如果不是则在前面补0
                {
                        bin[j]='0';
                        j++;
                }
                for(j=7;j>=0;j--)
                {
                        ret[curp]=bin[j];
                        curp++;
                }
                                                                                                                                             
        }
        ret[curp]='\0';
        printf("The binary is %s \n",ret);
        return 1;
}

[/code:1]
谢谢你
回复

使用道具 举报

发表于 2004-7-29 16:32:09 | 显示全部楼层
用代码标示符将代码括起来。在发贴栏上面有。
回复

使用道具 举报

 楼主| 发表于 2004-7-29 16:40:08 | 显示全部楼层
不好意思,不太明白
回复

使用道具 举报

 楼主| 发表于 2004-7-29 16:52:54 | 显示全部楼层

谢谢你们

谢谢你们,问题我已经解决了,动态数组是不是最好不要用啊 :-)  
回复

使用道具 举报

发表于 2004-7-29 17:03:18 | 显示全部楼层
ret没分配内存。动态数组?c里面好像没有
回复

使用道具 举报

 楼主| 发表于 2004-7-29 17:08:22 | 显示全部楼层
char *ret;
这种声明属于什么呢?
回复

使用道具 举报

发表于 2004-7-29 20:07:09 | 显示全部楼层
"char *ret;"这样的声明只是个字符指针,但它到底能做什么还要看具体代码。

你既想用动态数组却又不为它分配空间,当然会引起段错误。其实在你的程序中ret也只用到33个字节,直接定义为一个数组char ret[33]就行了,没必要动态分配。

另外程序中没有对空参数这一情况进行处理,如果程序运行时没有给出IP地址,它还是会引起段错误,最好能加上如下代码:
[code:1]
  if(argc<2){
    printf("Usage: yourexecname 192.168.0.1\n");
    exit(0);
  }
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 18:02 , Processed in 0.059092 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表