For an exercise we need to print the elements in argv and environ (by looping through the other one). I can get it to print everything but for some reason the first and second pointer element are the same, which doesn't happen when using array indices. e.g.:
size_t idx = 0;
while (environ[idx])
{
cout << idx << " = " << environ[idx] << '\n';
++idx;
}
prints (abbreviated):
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
trying to do the same with a pointer:
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
}
prints the following (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
The exact same things happens when I print argv by looping through environ, the first and second element print the same thing. I wanted to just loop from size_t = 1 but then it it won't print anything when no additional command line arguments are provided.. Why does this happen and not when using [idx]? I'm sure it's some pointer issue but pointers have always confused me so any help would be appreciated.
The problem is the location of your line:
As it stands, when the value
idxis added, it takes the value of the current loop (beforeidxis incremented). So, after printing out the value on the first run through theforloop, the value ofidxadded toenvironwill be ZERO!If you move that line of code to the beginning of your
forloop, it will work!