【问题标题】:c - segmentation fault (core dumped) pointer issuec - 分段错误(核心转储)指针问题
【发布时间】:2023-04-04 17:07:01
【问题描述】:

当我尝试使用参数运行我的程序时出现分段错误错误。现在我通过 GDB 运行它并找到有问题的行,它看起来像这样:

*dstip = (*optarg);

原型是:

char *dstip;

最后它在这一行被调用:

char *filter = ("ip dest host %s", dstip);

现在回头看,我并不惊讶它不起作用,因为它看起来......坦率地说是错误的,并且通过完全删除这些行(并更改过滤器文本)解决了问题。但是,我需要输入的 IPv4 地址显示在将使用的错误消息过滤器中,并且对指针毫无用处并且来回尝试了不同的东西,我无法做到正确。也就是我只得到warning initialization makes pointer from integer之类的……怎么办?

【问题讨论】:

  • @Scooter: optarg 是与getopt() 一起使用的全局变量之一。
  • 如果您想记录getopt() 找到的参数,通常只需编写:dstip = optarg; 将存储在变量optarg 中的指针分配给指针变量@ 987654331@.

标签: c pointers segmentation-fault ip-address


【解决方案1】:

声明

*dstip = (*optarg);

没有将dstip 设置为指向optarg。相反,它将dstip 指向的第一个字符设置为与optarg 指向的第一个字符相同的值。 IE。是一样的

dstip[0] = optarg[0];

由于dstip 是一个未初始化的指针,因此您更改了内存中未分配的区域,这将导致奇怪的事情发生。

另外,表达式

("ip dest host %s", dstip)

不会做你认为它做的事,至少如果你认为它会返回一个格式化的字符串。它真正做的是使用逗号运算符,它计算逗号两边的表达式,但只返回逗号右边的表达式的结果。

【讨论】:

  • 感谢您提供如此详尽的回答,但您建议我怎么做?编写 dstip = optarg; 已编译,但正如您所说,它只打印了 dstip 的值。不仅如此,而且每隔一段时间它就会工作或给出 GDB 找不到的段错误。
  • @youjustreadthis:确保初始化指针; char *dstip = 0; 或者char *dstip = "127.0.0.1";。在使用它之前确保指针不为空。要格式化过滤器字符串,请使用snprintf():char filterbuff[64]; snprintf(filterbuff, sizeof(fileterbuff), "ip dest host %s", dstip); filter = filterbuf;,或类似的东西。你可以给我的filterbuf 起名为filter 并放弃分配;这是否是一个安全的转换取决于变量filter 在代码的其他地方是如何声明和使用的。
猜你喜欢
  • 2021-05-04
  • 2015-05-12
  • 2018-07-28
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多