所以我看到了这个例子:
Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();
startActivity(i);
loop_pipe()是一个操作多个管道参数的函数。但是已经定义了插入到cmd中的此代码上的变量。 在我的个人代码中,我试图做相反的事情,创建变量,将参数插入变量,然后将其添加到cmd。但是没有发生的是“增加”需求。例如,代码如下所示:
int main()
{
char *ls[] = {"ls", NULL};
char *grep[] = {"grep", "pipe", NULL};
char *wc[] = {"wc", NULL};
char **cmd[] = {ls, grep, wc, NULL};
loop_pipe(cmd);
return (0);
}
我猜错了(因为它不起作用)但是没有使用索引设置插入位置足以在我的双指针内分配数组指针?如果没有,有人可以帮我清楚如何分配这样吗?
EDIT1:
我的代码简化如下:
*(cmd[pipe_count]) = arg;
答案 0 :(得分:2)
您可以将char **cmd[]
视为包含char **
元素的数组。因此,您可以为其分配char **
个元素。
cmd[i] = arg;
就这么简单。它与整数数组没什么不同。
// "foo" is a `const char[]`. So an array of them is a `const char *[]`
const char *ls[] = {"ls", NULL};
const char *grep[] = {"grep", "pipe", NULL};
const char *wc[] = {"wc", NULL};
// To store an array of `const char *[]` we need a `const char **[]`.
const char **cmd[10] = {NULL};
cmd[0] = ls;
cmd[1] = grep;
cmd[2] = wc;
更详细......
为简单起见,本示例的其余部分将同等对待char *[]
和char **
。有一些微妙的差异,但就我们的目的而言,它们并不重要。我们会将ls
,grep
和wc
视为char **
指针,将cmd
视为char ***
。
char **cmd[10]
为stack上的10个char **
指针分配空间。 char **
与任何其他指针的大小相同。我们假设64位整数或8个字节。其中10个意味着它分配80个字节。 cmd
本身是char ***
指针。这只对编译器有意义进行类型检查。最终,所有cmd
包含的是64位整数,表示内存中的位置。
与ls
,grep
和wc
相同。它们的类型为char **
,它只是一个64位整数,表示内存中的位置。
cmd[0] = ls
表示从cmd
的地址开始,以0 char **
指针的大小(因此为0)前进,然后分配包含在其中的char **
指针ls
到该位置。因此,如果cmd
位于内存位置100,则会写入100到107。
cmd[1] = grep
表示从cmd
的地址开始,100。按1 char **
个指针的大小前进,8。然后分配char **
指针中包含的grep
指针{1}}到该位置。所以100 + 8是108.然后将8个字节写入108到115。
cmd[2] = grep
将grep
中的64位数写入内存位置100 +(2 * 8)或116到123.
等等。它适用于任何指针数组。或指针指针。它只是一个奇特的整数数组。