解析C字符串和多个指针c字符串

时间:2017-02-07 00:22:49

标签: c pointers

我正在尝试制作解析器。我有一个只使用指针的版本但我想知道如何将它从指针(char * p)转换为c字符串(char p [])以更熟悉它们的工作方式。

我有一个功能...

(*args)[i] = (char*) malloc(sizeof(char) * tokenLen);

我的问题是什么是等效的。或者可能是对正在发生的事情的简要说明。其他解决方案只是提供工作代码而不是真正说明它是如何工

我不认为这与我的内存分配有关,使用指针和[]。这很好。如果有人有时间,也不确定如何运作。

{{1}}

2 个答案:

答案 0 :(得分:1)

第一句话:

arg2[0] = args[0];

arg2[0]的类型为charargs[0]的类型为char**。这项任务不起作用,因为它们属于不同的类型。

然而,这样的事情会起作用:

arg2[0] = (**args)[0]; /* or even (*args)[0][0] */

因为您提供arg2[0] char,这是正确的,因为它们是匹配的类型。 **args是指向args的第一个元素(char*的指针)的指针,要获得char,您需要索引[0]。他们有多种方法可以做到这一点。将arg2[0]分配给args[0][0][0]甚至***args是有效的,即使这些分配看起来很模糊。

第二个声明:

arg1 = (*args)[0];

会有效,因为您提供了arg1char*指针。*args是指向args的第一个元素的指针,char**,和索引[0]定位到char*指针。这会将(*args)[0];的地址存储在arg1中。这甚至可以用不那么流行的方式&(*(*args)[0])来编写,尽管这很难阅读而且没有必要。

此外,你的内存分配很好。 (*args)[i]是指向args的第一个元素的指针,char**[i]将引用char*指针。您需要事先为char**分配,因为这也是指向指针的未初始化指针。

您还可以缩短:

(*args)[i] = (char*) malloc(sizeof(char) * tokenLen);

为:

(*args)[i] = malloc(tokenLen);

当您don't need to cast return of malloc()时,sizeof(char)始终为1。 “

答案 1 :(得分:0)

char[]char *实际上是相同的,因为编译器将数组转换为指针。所以没有必要在它们之间进行转换。

将数组语法视为具有偏移量的指针取消引用的缩短版本:arg[5] == *(arg + 5)

arg2[0] = args[0];不会编译,因为args [0]为char**而arg2 [0]的类型为char

arg1 = (*args)[0]);有效,因为它们都具有相同的类型 - char *