使用指针打印argv和环境

问题描述 投票:0回答:1

为了进行练习,我们需要在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

当我通过遍历环境打印argv时,发生了完全相同的事情,第一个和第二个元素打印了相同的东西。我只想从size_t = 1循环,但是当没有提供其他命令行参数时,它不会打印任何内容。为什么使用[idx]时会发生这种情况,而不是呢?我敢肯定这是一些指针问题,但是指针一直使我感到困惑,因此我们将不胜感激。

c++ pointers argv environ
1个回答
0
投票

问题是您所在行的位置:

ptr = *(environ + idx); 

按现状,当添加值idx时,它将采用当前循环的值(在idx递增之前)。因此,在打印出第一个参数后,添加到idxenviron的值将为零!

如果将代码行移动到for循环的开始,它将起作用!


0
投票

循环内

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;

在第一次迭代中。

© www.soinside.com 2019 - 2024. All rights reserved.