Portál AbcLinuxu, 12. května 2025 02:20

Dotaz: posix_memalign - segmentation fault při přístupu ke korektně alokované paměti

29.10.2010 10:35 vencas | skóre: 32
posix_memalign - segmentation fault při přístupu ke korektně alokované paměti
Přečteno: 120×
Odpovědět | Admin

Zdravím, chci alokovat paměť zarovnanou na cache line size, používám k tomu posix_memalign. Někdy však dojde k tomu, že přístup k části paměti, která alokovaná je, selže. Ukazuje to následující program (povinný argv[1] je kolikrát spustit alokaci):

#include<stdlib.h>
#include<stdio.h>

int main(int argc, char** argv){
int n=atoi(argv[1]), i, value;
for(i=0; i<n; i++){
int* addr;
int succ=posix_memalign((void**)&(addr),64,64);
if(succ!=0) { fprintf(stderr,"Allocation error."); return 1; }
value=*(int*)(addr+(64-sizeof(int)));
// fprintf(stderr,"%p:%d\n",addr,value);
}
}

Jestli tomu správně rozumím, tak posix_memalign by mělo alokovat 64b paměti zarovnaných na 64b. Pokusím se potom přistoupit ke konci alokovaného kusu přes *(int*)(addr+64-sizeof(int)), což by mělo vzít konec alokovaného úseku jako int.

Bohužel když program pustím, tak při větším poštu cyklů (argv[1]) se vyseká se segmentation fault. Vyzkoušel jsem, že pomůže alokovat větší množství pamětí (např. 96, třetí argument posix_memalign), ale nerozumím proč to tak je.

Poradí mi někdo v čem je problém?

Díky moc. Venca


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.10.2010 11:11 vencas | skóre: 32
Rozbalit Rozbalit vše Re: posix_memalign - segmentation fault při přístupu ke korektně alokované paměti
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyřešeno, odpovídám si sám. Problém je v tom, že pointer aritmetika má jako jednotku velikost typu; addr je int*, takže addr+1 dá adresu (void*)addr+1*sizeof(int).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.