【问题标题】:POpen works with string but not variablePOpen 适用于字符串但不是变量
【发布时间】:2013-09-16 15:16:41
【问题描述】:

我可以让以下工作正常:

fp = popen("curl http://192.168.0.144:8000/adder?wsdl", "r");

但是当我这样尝试时:

char* cmd;
strcpy(cmd, "curl http://");
strcat(cmd, qrdata->ip_addr);
strcat(cmd, ":8000/adder?wsdl");

fp = popen(cmd, "r");

发生分段错误。

【问题讨论】:

  • ip_addr 是如何声明的?

标签: c curl segmentation-fault popen


【解决方案1】:

你需要为cmd分配内存:

    char cmd [256];

其中256-1 = 255 是您的字符串可以包含的最大字符数

【讨论】:

  • 这是一个非常保守的缓冲区。正如“对于问题中显示的示例而言太小” - 保守。 :)
【解决方案2】:

你没有为char * cmd分配内存。

如果使用 gcc,您可以使用 asprintf() 分配尽可能多的缓冲区,以便将格式化的字符串打印到:

#define _GNU_SOURCE
#include <stdio.h>

...

char * cmd = NULL;
asprintf(&cmd, "curl http://%s:8000/adder?wsdl", qrdata->ip_addr);

/* Use cmd. */

free(cmd);

注意:上面的示例假定qrdata-&gt;ip_addr 是一个以0 结尾的字符数组。

【讨论】:

    【解决方案3】:

    您还没有初始化cmd 变量。

    char* cmd = new char[MAX_LEN];
    

    当然你需要定义MAX_LEN

    #define MAX_LEN 1024
    

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多