Ей скъсах си нервите с това. Изглежда тривиално и просто, ама не - не е.
Разглеждаме този прост случай:
gat3way@debian:/tmp$ cat a.c
#include <unistd.h>
void main()
{
int a=123456;
size_t *ptr;
ptr=&a;
printf("%ld\n",*ptr);
}
Сега да компилираме 32-битова версия и да я изпълним:
gat3way@debian:/tmp$ gcc -o a a.c -m32
a.c: In function ‘main’:
a.c:9:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
gat3way@debian:/tmp$ ./a
123456
gat3way@debian:/tmp$
Очакван резултат, нали. Айде сега да пробваме да компилираме за 64-битова архитектура и да пробваме:
gat3way@debian:/tmp$ gcc -o a a.c
a.c: In function ‘main’:
a.c:8:8: warning: assignment from incompatible pointer type [enabled by default]
a.c:9:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
gat3way@debian:/tmp$ ./a
6644479007238775360
gat3way@debian:/tmp$
Сега никой не е казал че е хубава идея да присвояваме указател към size_t да сочи към int и да очакваме това да работи на различни таргети, обаче gcc до 4.4 някак си автоматично се грижеше за това, защото досега не е възниквало като проблем - и работеше защото вероятно gcc-то имплицитно е правело нещо по въпроса. Всъщност, дори warning не изкарваше тъпия компилатор, освен с -Wall и аз никога не съм се замислял толкова дали е лошо или не. Минах обаче на 4.6 и нещата загрубяха доста - супер странни проблеми, странни опити да се алокират терабайти памет и тем подобни глупости. Красота. Тъп съм знам.
Знам че сам съм си виновен (сега имам да преправям сума ти код) ама ще им таковам таковата на тези гадове