уважаемые, пожалуйста, почитайте таки вечерком на досуге Intel 64 and IA-32 Architectures - Software Developer Manual в связке с System V Application Binary Interface AMD64 Architecture Processor Supplement и постарайтесь не делать столь распространённой ошибки утверждая, что «на 64х битной системе указатель имеет размер 8 байт». это попросту не так в силу того, что 99% адресации в вашем исполняемом - косвенная относительно базы.
ps: да, я на 100% уверен, что 99.9% авторов в этом разделе никогда не видели и не трогали 64х битных архитектур, отличных от x86-64 (и не надо!). так что отсылка к спаркам или итаниумам & K будет явно не в кассу.
#include <stdlib.h>
struct node {
void *next;
int data;
};
struct node *
foo(void)
{
struct node *head = 0;
int i;
for (i = 0; i < 0x1234; i++) {
struct node *n = malloc(sizeof(*n));
n->data = i;
n->next = head;
head = n;
}
return head;
}
$ cc -c -Wall -Werror -O2 test.c
$ objdump -d test.o
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: 55 push %rbp
1: bf 10 00 00 00 mov $0x10,%edi
6: 53 push %rbx
7: bb 01 00 00 00 mov $0x1,%ebx
c: 48 83 ec 08 sub $0x8,%rsp
10: e8 00 00 00 00 callq 15 <foo+0x15>
15: c7 40 08 00 00 00 00 movl $0x0,0x8(%rax)
1c: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
23: 48 89 c5 mov %rax,%rbp
26: bf 10 00 00 00 mov $0x10,%edi
2b: e8 00 00 00 00 callq 30 <foo+0x30>
30: 89 58 08 mov %ebx,0x8(%rax)
33: 83 c3 01 add $0x1,%ebx
36: 48 89 28 mov %rbp,(%rax)
39: 81 fb 34 12 00 00 cmp $0x1234,%ebx
3f: 48 89 c5 mov %rax,%rbp
42: 75 e2 jne 26 <foo+0x26>
44: 48 83 c4 08 add $0x8,%rsp
48: 5b pop %rbx
49: 5d pop %rbp
4a: c3 retq
// wbr