Comportamiento extraño al imprimir punteros

Tengo el siguiente código:

#include <stdio.h>

typedef struct {
  int* arg1;
  int  arg2;
} data;

int main(int argc, char** argv) {
  data d;
  printf("arg1: %p | arg2: %d\n", d.arg1, d.arg2);
}

La salida termina siendo esod.arg1 no esNULL yd.arg2 es 0. Por ejemplo:

arg1: 0x7fff84b3d660 | arg2: 0

Cuando agrego un puntero a main, nada cambia. Sin embargo, cuando imprimo ese puntero:

#include <stdio.h>

typedef struct {
  int* arg1;
  int  arg2;
} data;

int main(int argc, char** argv) {
  data d;
  int* test;
  printf("arg1: %p | arg2: %d | test: %p\n", d.arg1, d.arg2, test);
}

la salida siempre resulta en:

arg1: (nil) | arg2: 4195264 | test: (nil)

¿Por qué estoy experimentando este comportamiento? No entiendo cómo imprimir otro valor de puntero cambia el valor de un puntero diferente a NULL. Tenga en cuenta que el compilador que estoy usando es GCC 4.8.2.

Respuestas a la pregunta(3)

Su respuesta a la pregunta