В этом примере a
не является const
.Это массив указателей на const
строки.Если вы хотите сделать a
сам const
, вам нужно:
static const char *const a[] = {"foo","bar","egg","spam"};
Независимо от того, const
или нет, всегда безопасно для чтения данных из нескольких потоков.если вы не пишете в него ни от одного из них.
Как примечание, обычно плохая идея объявлять массивы указателей на константные строки, особенно в коде, который может использоваться в разделяемых библиотеках, потому что этоприводит к большому количеству перемещений, и данные не могут быть расположены в фактических константных секциях.Гораздо лучшая техника:
static const char a[][5] = {"foo","bar","egg","spam"};
, где 5 выбрано так, что все ваши струны подходят.Если строки имеют переменную длину и вам не нужен быстрый доступ к ним (например, если они являются сообщениями об ошибках для функции, такой как strerror
для возврата), то хранение их таким образом является наиболее эффективным:
static const char a[] = "foo\0bar\0egg\0spam\0";
и вы можете получить доступ к n
-й строке с помощью:
const char *s;
for (i=0, s=a; i<n && *s; s+=strlen(s)+1);
return s;
Обратите внимание, что конечный \0
важен.Это приводит к тому, что строка имеет два 0 байта в конце, тем самым останавливая цикл, если n
выходит за пределы.В качестве альтернативы вы можете заранее проверить границы n
.