1 Temmuz 2019 Pazartesi

C Tarzı String Literal

Giriş
String literal iki şekilde tanımlanır.
1.const char *
Bu yöntem de string literal read only bellekte yer alır

2. const char*[] - Dikkat const char[] şeklinde değil!
Bu yöntem de string literal writable bellekte yer alır de değiştirilebilir.

String Literal'ın İçin Değiştirmek
Undefined behavior'a sebep olur. Şu kod hatalı
char *st = "aaa";
*st = 'b'; 
 return 0;
Şöyle yaparız.
static char st_arr[] = "aaa";
char *st = st_arr;
*st = 'b'; 
Aynı İçeriğe Sahip String Literal
Açıklaması şöyle.
The compiler is allowed, but not required, to combine storage for equal or overlapping string literals. That means that identical string literals may or may not compare equal when compared by pointer.
Bir başka açıklama şöyle.
Whether all string literals are distinct (that is, are stored in nonoverlapping objects) and whether successive evaluations of a string-literal yield the same or a different object is unspecified.
Örnek
Elimizde şöyle bir kod olsun. Derleyicisine bağlı olarak A== B true veya false olabilir.
static const char *A = "some";
static const char *B = "some";

void f() {
  if (A == B) {
    throw "Hello, string merging!";
  }
}
String Literal Return Etmek
Şu kod dangling pointer dönmez çünkü string literal'a pointer dönüyoruz ve string literal static storage kullanılır.
const char* f()
{
  const char* arr[]={"test"};
  return arr[0];
}
Şu kod ile aynıdır.
const char* f()
{
  const char* arr0 = "test";
  return arr0;
}
Şu kod ise undefined behavior'a sebep olur.
const char* f() {
  const char arr[] = "test"; // local array of char, not array of char const*
  return arr;
}

Hiç yorum yok:

Yorum Gönder