当我尝试使用参数运行程序时,我收到了分段错误错误。现在我通过GDB运行它并找到有问题的行,它看起来像这样:
*dstip = (*optarg);
原型是:
char *dstip;
最后在这一行中被调用:
char *filter = ("ip dest host %s", dstip);
现在回过头来看,我并不感到惊讶它看起来不起作用......坦率地说,错误地通过删除这些行(并改变过滤器文本)来解决问题。但是,我需要将输入的IPv4地址显示在错误消息过滤器中,并且对指针没用,并且来回尝试过不同的东西我无法做到正确。也就是说,我只得到warning initialization makes pointer from integer
之类的......怎么办?
答案 0 :(得分:5)
声明
*dstip = (*optarg);
未将dstip
设为指向optarg
。相反,它将dstip
指向的第一个字符设置为与optarg
指向的第一个字符相同的值。即它与
dstip[0] = optarg[0];
由于dstip
是未初始化的指针,因此您更改了内存中未分配的区域,这将导致发生奇怪的事情。
另外,表达式
("ip dest host %s", dstip)
不会按照您的想法执行操作,至少如果您认为它将返回格式化的字符串。它真正做的是使用逗号运算符来计算逗号两边的表达式,但只返回逗号右侧表达式的结果。