LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1027|回复: 6

请教一个c指针的问题~~

[复制链接]
发表于 2007-11-6 10:32:54 | 显示全部楼层 |阅读模式
程序从网卡配置文件中获得广播地址,为什么在主函数中得不到正确的值呢?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

bool get_ip(char *ip[]);

int main()
{
        char *ipaddr[4]={""};       
        int i=0;
        get_ip(ipaddr);
        for(i=0;i<4;i++)
        {
                printf("222 %s\n",ipaddr);
        }
}

bool get_ip(char *ip[])
{
        FILE *fp;
        char buff[256];
        char *p;
        char eth_cfg_name[4][128]={"/etc/sysconfig/network-scripts/ifcfg-eth0",
                                                                "/etc/sysconfig/network-scripts/ifcfg-eth1",
                                                                "/etc/sysconfig/network-scripts/ifcfg-eth2",
                                                                "/etc/sysconfig/network-scripts/ifcfg-eth3",};
        int i=0,temp=0;
       
        for(i=0;i<4;i++)
        {
                /*打开文件*/
                if((fp=fopen(eth_cfg_name,"r"))==NULL)
                {
                        printf("Cannot open %s!\n",eth_cfg_name);
                        continue;
                }

                /*读出文件内容,逐行读*/
                while(!feof(fp))
                {
                        fgets(buff,sizeof(buff),fp);

                        while(buff[temp]!='\0')
                        {
                                buff[temp]=toupper(buff[temp]);
                                temp++;
                        }
                        //printf("%s\n",buff);
                        if((p=strstr(buff,"BROADCAST"))!=NULL)
                        {
                                /*提取ip*/
                               
                                ip=p+10;
                                printf("111 %s\n",ip);
                        }
                }
                fclose(fp);

        }
        return true;
}
发表于 2007-11-6 10:49:20 | 显示全部楼层
//printf("%s\n",buff);
if((p=strstr(buff,"BROADCAST"))!=NULL)
{
/*提取ip*/

ip=p+10;
printf("111 %s\n",ip);
}
p 是指向get_ip栈上变量buf的,get_ip退出后ip指向的地址就被回收了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-6 11:27:06 | 显示全部楼层
Post by hcj116;1777976
p 是指向get_ip栈上变量buf的,get_ip退出后ip指向的地址就被回收了
明白了。。。
这个指针是不能带回值的。。。。
这个地方我本来使用的二维数组,是可以的。
现在我想用指针,该怎么修改呢?
回复 支持 反对

使用道具 举报

发表于 2007-11-6 17:10:59 | 显示全部楼层
不可。
你总要把数据放在一个缓冲里面,你都没有提供缓冲,那么要把数据放在哪里呢?

二维数组其实就是提供了缓冲区
回复 支持 反对

使用道具 举报

发表于 2007-11-7 10:20:38 | 显示全部楼层
f((p=strstr(buff,"BROADCAST"))!=NULL)
{
/*提取ip*/

ip=p+10;
printf("111 %s\n",ip);
}
}
将ip=p+10;改为下面两句:
ip = malloc(strlen(p + 10) + 11);
strcpy(ip, p + 10);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-7 10:30:00 | 显示全部楼层
谢谢拉,已经想明白了
形参只是声明了一个参数的类型,并没有分配空间,所以是带不回值的。。。
恩,对指针的认识又深了一步。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-7 10:57:24 | 显示全部楼层
对了,应该稍微改动一下:
ip=(char *)malloc(strlen(p+10));
strcpy(ip,p+10);
ok!
再次谢谢各位!
回复 支持 反对

使用道具 举报

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

本版积分规则

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