// Environment Variables, demonstration program #include #include extern char **environ; /* find the NULL pointer that indicates the end of the array v */ static int pos_null(char *v[]) { if (v == NULL) return -1; int i = 0; while (*v != NULL) { v++; i++; } return i; } // Exercise. Why did we require the extra level of indirection? static void print(int *pargc, char **pargv[], char **penvp[]) { int n; n = pos_null(environ); printf(" %08p &environ, %d elements\n", &environ, n); printf(" %08p &environ[0]\n", &environ[0]); printf(" %08p &environ[%d]\n", &environ[n], n); printf(" %08p &environ[0][0]\n", &environ[0][0]); printf("\n"); printf(" %08p &argc\n", pargc); printf("\n"); n = pos_null(*pargv); printf(" %08p &argv, %d elements\n", pargv, n); printf(" %08p &argv[0]\n", &(*pargv)[0]); printf(" %08p &argv[%d]\n", &(*pargv)[n], n); printf(" %08p &argv[0][0]\n", &(*pargv)[0][0]); printf("\n"); n = pos_null(*penvp); printf(" %08p &envp, %d elements\n", penvp, n); printf(" %08p &envp[0]\n", &(*penvp)[0]); printf(" %08p &envp[%d]\n", &(*penvp)[n], n); printf(" %08p &envp[0][0]\n", &(*penvp)[0][0]); printf("\n"); } int main(int argc, char *argv[], char *envp[]) { int n; printf("initial conditions\n"); print(&argc, &argv, &envp); printf("after putenv(\"A=B\");\n"); putenv("A=B"); print(&argc, &argv, &envp); printf("after setenv(\"C\", \"D\", 1);\n"); setenv("C", "D", 1); print(&argc, &argv, &envp); printf("after unsetenv(\"A\");\n"); unsetenv("A=B"); print(&argc, &argv, &envp); return 0; }