Строковый литерал внутри структуры - C - PullRequest
5 голосов
/ 22 февраля 2011

Мне нужно заключить буквенную строку в структуру.Код ниже не скомпилируется, но, надеюсь, иллюстрирует то, что я хотел бы сделать?

struct my_struct
{
char* str = "string literal";
};

Ответы [ 6 ]

16 голосов
/ 22 февраля 2011

Вы не можете инициализировать ни одного члена в объявлении структуры.Вы должны инициализировать структуру при создании экземпляра структуры.

struct my_struct
{
   char* str;
};

int main(int argc,char *argv[]) 
{
  struct my_struct foo = {"string literal"};
  ...
}

Поскольку вы хотите, чтобы элемент str ссылался на строковый литерал, вам лучше сделать его const char *str,поскольку вы не можете каким-либо образом изменять строковые литералы.

В качестве альтернативы

Предоставьте функцию инициализации

, чтобы каждый раз инициализировать вашу структуру в известное состояние.

struct my_struct
{
   const char* str;
   int bar;
};

void init_my_struct(strut my_struct *s)
{
   s->str = "string literal";
   s->bar = 0;
}
int main(int argc,char *argv[]) 
{
  struct my_struct foo;
  init_my_struct(&foo);

Или инициализировать его с помощью препроцессора:

struct my_struct
{
   const char* str;
   int bar;
}; 

#define MY_STRUCT_INITIALIZER {"string literal",0}
int main(int argc,char *argv[]) 
 {
   struct my_struct foo = MY_STRUCT_INITALIZER;

Или скопировать из известного объекта:

struct my_struct
{
   const char* str;
   int bar;
};
const struct my_struct my_struct_init = {"string_literal",0};

int main(int argc,char *argv[]) 
{
   struct my_struct foo = my_struct_init;
1 голос
/ 20 июля 2018

Другой способ, но все же, вы должны использовать инициализированный экземпляр по умолчанию для инициализации ваших новых экземпляров.

struct my_struct
{
    const char * str;
} ms_def {
    .str = "value"
};

int main()
{
    my_struct obj = ms_def;
    printf("%s\n", obj.str);
    return 0;
}
1 голос
/ 20 апреля 2018

Прямая инициализация не допускается. Вместо этого можно сделать указатель и указать желаемую строку.

1 голос
/ 22 февраля 2011

Как уже дано в ответах, объявление структуры и инициализация должны быть разделены, и это должно применяться последовательно, если это требуется для всех случаев my_struct. C ++ предлагает лучшее решение; если бы вы могли использовать компиляцию C ++, то это можно автоматизировать с помощью конструктора следующим образом:

struct my_struct
{
    my_struct() : str("string literal"){}
    char* str ;
};

Тогда для всех экземпляров my_struct str будет указывать на буквальную константу "string literal" при создании экземпляра. Однако помните, что это неконстантный указатель, указывающий на константную строку.

1 голос
/ 22 февраля 2011

Я думаю, вы хотите это:

struct my_struct
{
    char* z;
};

// ...

struct my_struct s = {"string literal"};
1 голос
/ 22 февраля 2011

Вам нужно будет создать экземпляр структуры, а затем установить элемент str.И если вы планируете использовать строковые литералы с ним, вы действительно должны изменить его на const char* str.

struct my_struct
{
    const char* str;
};

int main() {
    struct my_struct s1;
    s1.str = "string literal";

    /* or */
    struct my_struct s2 = {"string literal"};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...