我正在尝试制作解析器。我有一个只使用指针的版本但我想知道如何将它从指针(char * p)转换为c字符串(char p [])以更熟悉它们的工作方式。
我有一个功能...
(*args)[i] = (char*) malloc(sizeof(char) * tokenLen);
我的问题是什么是等效的。或者可能是对正在发生的事情的简要说明。其他解决方案只是提供工作代码而不是真正说明它是如何工
我不认为这与我的内存分配有关,使用指针和[]。这很好。如果有人有时间,也不确定如何运作。
{{1}}
答案 0 :(得分:1)
第一句话:
arg2[0] = args[0];
arg2[0]
的类型为char
,args[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];
会有效,因为您提供了arg1
,char*
指针。*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 *
。