使用指针打印 argv 和 environ
Printing argv and environ with pointers
作为练习,我们需要打印 argv 和 environ 中的元素(通过循环另一个)。我可以让它打印所有内容,但出于某种原因,第一个和第二个指针元素是相同的,这在使用数组索引时不会发生。
例如:
size_t idx = 0;
while (environ[idx])
{
cout << idx << " = " << environ[idx] << '\n';
++idx;
}
打印(缩写):
0 = XDG_VTNR=7
1 = XDG_SESSION_ID=c4
2 = XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/*********
3 = CLUTTER_IM_MODULE=
4 = DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-qBmfhGvfX0,guid=33afede959ece95fbd4e3c055da5de6c
5 = QT_STYLE_OVERRIDE=gtk
6 = GPG_AGENT_INFO=/home/s2161915/.gnupg/S.gpg-agent:0:1
尝试用指针做同样的事情:
char *ptr = *environ;
for (size_t idx = 0; *(argv + idx); ++idx)
{
if (ptr) // ptr isn't a nullptr
{
cout << idx << ": env: " << ptr << '\n';
// make ptr point to next element in environ
ptr = *(environ + idx);
} else
break; // end of environ
}
打印以下内容 (argc = 7):
0: env: XDG_VTNR=7
1: env: XDG_VTNR=7
2: env: XDG_SESSION_ID=c4
3: env: XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/*********
4: env: CLUTTER_IM_MODULE=
5: env: DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-qBmfhGvfX0,guid=33afede959ece95fbd4e3c055da5de6c
6: env: QT_STYLE_OVERRIDE=gtk
当我通过循环遍历 environ 打印 argv 时,会发生完全相同的事情,第一个和第二个元素打印相同的内容。我只想从 size_t = 1 循环,但是当没有提供额外的命令行参数时它不会打印任何东西..
为什么会发生这种情况而不是在使用 [idx] 时?我确定这是一些指针问题,但指针总是让我感到困惑,因此我们将不胜感激。
问题出在你的线路位置:
ptr = *(environ + idx);
就目前而言,当添加值idx
时,它采用当前循环的值(在idx
递增之前)。因此,在通过 for
循环打印出第一个 运行 的值后,添加到 environ
的 idx
的值将为零!
如果将该行代码移动到 for
循环的 开头 ,它将起作用!
循环内
char *ptr = *environ;
for (size_t idx = 0; *(argv + idx); ++idx)
{
if (ptr) // ptr isn't a nullptr
{
cout << idx << ": env: " << ptr << '\n';
// make ptr point to next element in environ
ptr = *(environ + idx);
} else
break; // end of environ
}
表达式
ptr = *(environ + idx);
给出与循环前表达式相同的指针值
char *ptr = *environ;
在循环的第一次迭代中。也就是说 ptr
在第一次迭代中没有改变。当 idx
等于 0
时,*(environ + 0)
与 *environ
相同。
您可以像这样重写循环
char *ptr;
for (size_t idx = 0; ( ptr = *(argv + idx) ) != nullptr; ++idx)
{
cout << idx << ": env: " << ptr << '\n';
}
作为练习,我们需要打印 argv 和 environ 中的元素(通过循环另一个)。我可以让它打印所有内容,但出于某种原因,第一个和第二个指针元素是相同的,这在使用数组索引时不会发生。 例如:
size_t idx = 0;
while (environ[idx])
{
cout << idx << " = " << environ[idx] << '\n';
++idx;
}
打印(缩写):
0 = XDG_VTNR=7
1 = XDG_SESSION_ID=c4
2 = XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/*********
3 = CLUTTER_IM_MODULE=
4 = DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-qBmfhGvfX0,guid=33afede959ece95fbd4e3c055da5de6c
5 = QT_STYLE_OVERRIDE=gtk
6 = GPG_AGENT_INFO=/home/s2161915/.gnupg/S.gpg-agent:0:1
尝试用指针做同样的事情:
char *ptr = *environ;
for (size_t idx = 0; *(argv + idx); ++idx)
{
if (ptr) // ptr isn't a nullptr
{
cout << idx << ": env: " << ptr << '\n';
// make ptr point to next element in environ
ptr = *(environ + idx);
} else
break; // end of environ
}
打印以下内容 (argc = 7):
0: env: XDG_VTNR=7
1: env: XDG_VTNR=7
2: env: XDG_SESSION_ID=c4
3: env: XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/*********
4: env: CLUTTER_IM_MODULE=
5: env: DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-qBmfhGvfX0,guid=33afede959ece95fbd4e3c055da5de6c
6: env: QT_STYLE_OVERRIDE=gtk
当我通过循环遍历 environ 打印 argv 时,会发生完全相同的事情,第一个和第二个元素打印相同的内容。我只想从 size_t = 1 循环,但是当没有提供额外的命令行参数时它不会打印任何东西.. 为什么会发生这种情况而不是在使用 [idx] 时?我确定这是一些指针问题,但指针总是让我感到困惑,因此我们将不胜感激。
问题出在你的线路位置:
ptr = *(environ + idx);
就目前而言,当添加值idx
时,它采用当前循环的值(在idx
递增之前)。因此,在通过 for
循环打印出第一个 运行 的值后,添加到 environ
的 idx
的值将为零!
如果将该行代码移动到 for
循环的 开头 ,它将起作用!
循环内
char *ptr = *environ;
for (size_t idx = 0; *(argv + idx); ++idx)
{
if (ptr) // ptr isn't a nullptr
{
cout << idx << ": env: " << ptr << '\n';
// make ptr point to next element in environ
ptr = *(environ + idx);
} else
break; // end of environ
}
表达式
ptr = *(environ + idx);
给出与循环前表达式相同的指针值
char *ptr = *environ;
在循环的第一次迭代中。也就是说 ptr
在第一次迭代中没有改变。当 idx
等于 0
时,*(environ + 0)
与 *environ
相同。
您可以像这样重写循环
char *ptr;
for (size_t idx = 0; ( ptr = *(argv + idx) ) != nullptr; ++idx)
{
cout << idx << ": env: " << ptr << '\n';
}