[Çözüldü] C'de pointer olusturma

Başlatan efder, 25 Şubat 2015 - 16:13:47

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

efder

Arkadaşlar kısaca açıklamam gerekirse 4 byte uzunluğundaki unsigned int türünden kendi pointerımı oluşturmaya çalışıyorum ancak core dumped(segmentation fault) hatası alıyorum.Kod aşağıda,debuggerla baktığımda sorunun printf satırlarında olduğunu gördüm,ilgilenebilirsiniz çok mutlu olurum.(Ubuntu 14.10 kullanıcısıyım.)


#include <stdio.h>

int main()
{
int i;
char *a;

char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
int int_array[5] = {1, 2, 3, 4, 5};

unsigned int hacky_nonpointer ;

hacky_nonpointer = (unsigned int) char_array;
for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to 0x%08x which contains the char '%c' \n",
hacky_nonpointer,*(char *(hacky_nonpointer)));


hacky_nonpointer = hacky_nonpointer + sizeof(char);
}

hacky_nonpointer = (unsigned) int_array;

for(i=0; i < 5; i++){
printf("[char pointer] points to %08x, which contains the integer %d\n",
hacky_nonpointer, *((int *)hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int);
}

return 0;
}

hanifikuzucu

daha yeni eğitimine başladım çok bilmem ama  "%d"    çift tırnak içinde olması gerekiyor   ' '   tek tırnak içinde yazmışsınız  sadece  yazım hatası var sanırım   kolay gelsin

7hr33l3t73r

CIkti asagidaki sekilde

./test
[hacky_nonpointer] points to 0xbfa85837 which contains the char 'a'
[hacky_nonpointer] points to 0xbfa85838 which contains the char 'b'
[hacky_nonpointer] points to 0xbfa85839 which contains the char 'c'
[hacky_nonpointer] points to 0xbfa8583a which contains the char 'd'
[hacky_nonpointer] points to 0xbfa8583b which contains the char 'e'
[char pointer] points to bfa85820, which contains the integer 1
[char pointer] points to bfa85824, which contains the integer 2
[char pointer] points to bfa85828, which contains the integer 3
[char pointer] points to bfa8582c, which contains the integer 4
[char pointer] points to bfa85830, which contains the integer 5

kaynak kod

#include <stdio.h>

int main()
{
int i;
//char *a;

char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
int int_array[5] = {1, 2, 3, 4, 5};

unsigned int hacky_nonpointer;

hacky_nonpointer = (unsigned int) char_array;
for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to 0x%08x which contains the char '%c' \n",
hacky_nonpointer,*((char *) hacky_nonpointer));


hacky_nonpointer = hacky_nonpointer + sizeof(char);
}

hacky_nonpointer = (unsigned) int_array;

for(i=0; i < 5; i++){
printf("[char pointer] points to %08x, which contains the integer %d\n",
hacky_nonpointer, *((int *)hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int);
}

//return 0;
}
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

hanifikuzucu



printf("[hacky_nonpointer] points to 0x%08x which contains the char '%c' \n",
hacky_nonpointer,*((char *) hacky_nonpointer));

printf("[char pointer] points to %08x, which contains the integer %d\n",
hacky_nonpointer, *((int *)hacky_nonpointer));

ikisi arasında  gördüğüm farklı olan yer  oraların yazımı  onun dışanda konuyu bilmiyorum

Reverser

pointerlarla aram herzaman kötü olmuştur. Sanırım kullandığınız sistem ve derleyici 64 bit anladığım kadarıyla sorun şu,

64 bit makinalar, 64 bitlik adres ve pointer alanına sahiptir ve siz pointerı 32 bitlik unsigned int'e atıyorsunuz bu döküm pointer'a 64 bit olarak tekrar geri dönüyor sonuç olarak pointer'ın önemli olan 32 bitlik kısmı gitmiş oluyor bu durumda doğru boyuta sahip integer kullanmak daha doğru.


XFCE ROCKS !
Powered by Thunar & XFWM4



7hr33l3t73r

Bu da 64 bit icin
Kaynak kod

#include <stdio.h>

int main()
{
int i;
//char *a;

char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
int int_array[5] = {1, 2, 3, 4, 5};

long unsigned int hacky_nonpointer;

hacky_nonpointer = (long unsigned int) char_array;
for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to 0x%08x which contains the char '%c' \n",
hacky_nonpointer,*((char *) hacky_nonpointer));


hacky_nonpointer = hacky_nonpointer + sizeof(char);
}

hacky_nonpointer = (long unsigned) int_array;

for(i=0; i < 5; i++){
printf("[char pointer] points to %08x, which contains the integer %d\n",
hacky_nonpointer, *((int *)hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int);
}

//return 0;
}

Cikti

[hacky_nonpointer] points to 0xf6949090 which contains the char 'a'
[hacky_nonpointer] points to 0xf6949091 which contains the char 'b'
[hacky_nonpointer] points to 0xf6949092 which contains the char 'c'
[hacky_nonpointer] points to 0xf6949093 which contains the char 'd'
[hacky_nonpointer] points to 0xf6949094 which contains the char 'e'
[char pointer] points to f6949070, which contains the integer 1
[char pointer] points to f6949074, which contains the integer 2
[char pointer] points to f6949078, which contains the integer 3
[char pointer] points to f694907c, which contains the integer 4
[char pointer] points to f6949080, which contains the integer 5
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

efder

Her birinize ilginiz için çok teşekkür ederim, gerçekten çok faydalı oldu.Makinam dediğiniz gibi 64 bitlik bir makina olduğu için bu sorunla karşılaşmışım :)

Reverser


XFCE ROCKS !
Powered by Thunar & XFWM4