PDA

Tam Sürümünü Görmek İçin : Pointer & Dİnamik Bellek


quasimodo
29/12/2006, 17:23
Ben bu pointerlar konusuna acayip takılmış bulunmaktayım. Bir kaç soru sormak istiyorum.

Asagidaki kodda belirtilern hatanın olmasının nedeni nedir ???

#include <stdio.h>
int main()
{
char * p = NULL;
printf("merhaba");
char * s = NULL; //Decleration is not allowed here..
s = "merhaba";
p = s;
puts(p);
}

Fakat boyle yapinca bir hata olmuyor:

#include <stdio.h>
int main()
{
char * p = NULL;
char * s = NULL;
printf("merhaba");
s = "merhaba";
p = s;
puts(p);
}

Yine ayni sekilde belirtilen satirlarda belirtilen hatalari veriyor

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

int yerAyir(void)
{
int * p = NULL;
p = (int *) malloc(sizeof(int ) * 5);
int i = 0; //declaration is not allowed here
for(; i < 5; ++i)
*(p++) = i;
return p;
}

int main()
{
int * p = 0;
printf("%d\n", p);
p = yerAyir();
int i = 4; //declaration is not allowed here
for(; i > 0; --i)
printf("%d ", *(p + i));
getch();
return 0;
}

forlarin i tanımlamalarini pointer tanimlamasinin
altinda yapinca düzeliyor


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

int yerAyir(void)
{
int * p = NULL;
int i = 0;
p = (int *) malloc(sizeof(int ) * 5);
for(; i < 5; ++i)
*(p++) = i;
return p;
}

int main()
{
int * p = 0;
int i = 4;
printf("%d\n", p);
p = yerAyir();
for(; i > 0; --i)
printf("%d ", *(p + i));
getch();
return 0;
}
Bunlarin nedeni nedir cozebilmis degilim ???


mr1yh1
29/12/2006, 18:40
Pascal da ve C de bu var.
başka birşey yapmadan önce, değişkenleri declare etmen lazım.
eskiler bunun iyi bir programlama alışkanlığı olduğu düşünmüşler.
yani kullanacağın her değişken kodun başında görünüyor.

bugün için durum değişti,
birşeyi ona ihtiyaç duyduğun yerde tanımlaman daha doğru kabul ediliyor.

C++ da bu problem olmaz.

serimc
29/12/2006, 21:15
Sen bu hataları hangi derleyicide alıyorsun?

Normalde ilk kodda hata yok, ikincide de hata yok, üçüncüde hata var ama declarationdan kaynaklanmıyor.yerAyir'ın geri dönüş değeri int demişsin ama pointer döndürmüşsün.

mr_c
29/12/2006, 21:25
Büyük ihtimalle eski bir derleyicide alıyor. C nin ANSI standartlarına uyumu için komite birkaç kez toplandı ANSI C 89 ANSI C99 gibi. Bu derleyicilerin eski standardı desteklermerlinden dolayı olabilir. Ayrıca yeni C derleyicileri aynı zaman da C++ derleyicileri olduğundan sizin hata almayıp arkadaşın alması normal. C++ buna izin veriyor arkadaşın elindeki derleyici eski bir derleyici yada sadece C derleyicisi. C ile C++ arasında böyle farklar var.

Tahminde bulunuyorum TC eski bir sürümü.

quasimodo
29/12/2006, 22:20
Derleyim Borland C Builder 6.0 yani en son surumu.
int * yerAyir(void) olacakti yanlis yazmisim....
Simdi Derleyicim eski olmadigindan hata almamin nedeni bu degil. Borland ta da kullananlarin bilecegi gibi C ve C++ ayri sekilde aciliyor. Yani ozet olarak C de boyle bir kullanim yokmu cevap?

acehreli
29/12/2006, 23:57
C'de boyle bir kullanim yok. C'nin yeni standardi buna izin veriyor olabilir; ben yakindan izlemiyorum.

Ali

mr_c
30/12/2006, 02:47
C89 uyumlu derleyiciler başta değişken tanımlamaya zorlar aksi durumda hata verir.
C99 uyumlu derleyiciler ve C++ derleyicileri arada tanımlama yapmaya izin verir.

Derleyicinizin hangi standardı esas alarak derleme yaptığını ayarlama imkanınız var. Derleyicinizin dökümanlarını inceleyin.

Eski derleyicileri yeni standarda ayarlayamazsınız ama yeni derleyiciler geriye uyumluluk içi eski standarda ayarlı olabilir.