ошибка инициализации структуры - PullRequest
0 голосов
/ 10 марта 2011

Мне трудно инициализировать структуру в коде ниже.Может ли это быть сделано, или мне действительно нужно memcpy (urg) 5-символьную строку в структуру?

struct MyStruct  
{  
    char x[5];  
};

main(...)  
{  
    const char* MyString = {"mnopq"}; // I understand this is a non-NULL terminated string -  
                                  // it's OK, I just want five character fields in an array

struct MyStruct = {MyString};     // <---This gives warnings below  
}

предупреждение: пропущенные скобки вокруг инициализатора
предупреждение: инициализация делает целое число из указателябез приведения

Если я оберну инициализатор как:

struct MyStruct = {{MyString}};

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

Заранее спасибо за помощь.

Ответы [ 4 ]

4 голосов
/ 10 марта 2011

"mnopq" - это массив, const char * MyString - нет.

struct MyStruct foo = {"abcde"}; будет работать, тогда как ваш подход преобразует указатель MyString в целое значение и присваивает его первому элементу x.

3 голосов
/ 10 марта 2011

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

Если вы хотите использовать char x [5] вместо const char *, вы можете инициализироватьдвумя способами:

struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}};

или вы можете сделать

struct MyStruct ms = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}};

Первый набор фигурных скобок предназначен для инициализации членов структуры, второй набор предназначен для инициализации членов массива символов.поэтому каждый член (char) должен быть установлен индивидуально.

0 голосов
/ 10 марта 2011

Ответ от DavidMFrey правильный и должен получить кредит перед моим!Однако вот исходный код, использующий его ответ, так как я смог его запустить:

#include <stdio.h>
struct MyStruct  
{  
    char x[5];  
};
int main(void)  
{  
    const char* MyString = "mnopq";
    struct MyStruct foo = {{ MyString[0], MyString[1], MyString[2], MyString[3], MyString[4]}};
    printf("foo.x is: %s\n", foo.x); // outputs: foo.x is: mnopq¦ah¦"

    struct MyStruct ms = {{'m', 'n', 'o', 'p', 'q'}};
    printf("ms.x is: %s\n", ms.x);   // ms.x is: mnopq

    return 0;
}
0 голосов
/ 10 марта 2011

Вам необходимо объявить переменную типа MyStruct и присвоить ей значение x для этой строки. Это должно работать:

struct MyStruct {
char x[5];
};

int main(int argc, char *argv[]) {

   struct MyStruct a;
   const char* MyString = "mnop";

   strncpy((a.x), MyString, 5);

   /* 
    *if within the 5 characters you do not have the null char it will 
    * also print garbage
    */
   printf("%s", a.x);

   return 0;
}

Однако вы не можете назначить указатель на const char массиву char, так как они разных типов. Поэтому вам нужно либо использовать char * в структуре, либо использовать memcpy / strcpy для получения информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...