Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C指针/HTTP解析器(为什么我的代码不起作用)_C_Pointers - Fatal编程技术网

C指针/HTTP解析器(为什么我的代码不起作用)

C指针/HTTP解析器(为什么我的代码不起作用),c,pointers,C,Pointers,我想我知道一些关于C指针的基础知识,但是我不知道这个非常基本的HTTP GET请求解析器的启动有什么问题 我已经仔细阅读了代码并验证了strstr()是否返回了正确的字符串。但是,行“p_server=pSubString”不起作用。它正试图写入导致SIG故障的p_服务器点。我尝试了一系列不同的与&和*运算符的变体,但运气不佳 另外,我正在撰写的书(Kay和Steven Robbins 19.8 p.676编写的UNIX系统编程)说,解析函数应该使用指向指针的指针(即**p_路径)。你知道为什么

我想我知道一些关于C指针的基础知识,但是我不知道这个非常基本的HTTP GET请求解析器的启动有什么问题

我已经仔细阅读了代码并验证了strstr()是否返回了正确的字符串。但是,行“p_server=pSubString”不起作用。它正试图写入导致SIG故障的p_服务器点。我尝试了一系列不同的与&和*运算符的变体,但运气不佳

另外,我正在撰写的书(Kay和Steven Robbins 19.8 p.676编写的UNIX系统编程)说,解析函数应该使用指向指针的指针(即**p_路径)。你知道为什么吗?(在尝试p2p后,我选择了常规指针,因为我认为这会更容易)

谢谢

PS:my_strsttr()是库
strstrstr()
。我只是在我的代码中放了一个副本,这样我就可以用GDB逐步完成它。

是的,您确实需要“指针到指针”。。。此代码例如:

pSubString   = my_strstr( inlin, "www");   
p_server = pSubString; 
将“p_服务器”设置为找到“www”的地址。这不会更改“调用”到“parse()”中使用的指针。。。因此,只要
parse()
返回,它就会丢失

假设您修改了
parse()
,如下所示:

int parse(char *inlin, char **p_command, char **p_server, char **p_path, char **p_protocol, char **p_port)
{

    int length;
    char * pSubString;

    p_command  = inlin;
    pSubString   = my_strstr( inlin, "www");   
    *p_server = pSubString;

    pSubString   = my_strstr( p_server, "/");
    *p_path = pSubString;

    pSubString   = my_strstr( p_path, "HTTP");
    *p_protocol = pSubString;
}
假设您从以下代码段调用
parse()

char *my_command  = NULL;
char *my_server   = NULL;
char *my_path     = NULL;
char *my_protocol = NULL;
char *my_port     = NULL;
parse(buffer, &my_command, &my_server, &my_path, &my_protocol, &my_port);

在此更改之后,“my_”变量的值将包含parse()中对my_strstr()的各种调用中的地址。

您几乎肯定误判了该问题
p_server=pSubString
不能导致seg故障,因为它没有取消引用任何指针。如果您需要帮助,请提供一个详细的说明,并确切说明程序的行为。试着运行代码,看看是否有内存泄漏。把您的C语言书拿回来,阅读更多关于指向指针的指针以及字符串如何存储在内存中的内容;即使在SIGSEGV被“修复”之后,您的代码一开始看起来也不正确。非常感谢TonyB。你的解释真的帮了我的忙。
char *my_command  = NULL;
char *my_server   = NULL;
char *my_path     = NULL;
char *my_protocol = NULL;
char *my_port     = NULL;
parse(buffer, &my_command, &my_server, &my_path, &my_protocol, &my_port);