2017-02-19 9 views
0

Мне нужна ваша помощь! Почему в C структурах данных, хранящихся в символьных строках работает только 1 тип декларации: char *name; работает, но char []name; не работает.Char string в структуре C

Но когда попробовать объявить строку символов внутри кода (без использования структуры), все работает. Пример кода, иллюстрирующий, что при объявлении массива char работают оба типа объявлений.

#include "funct.h" 
#include "stdio.h" 

//structure employee name and surname only works when using char* pointers 

struct employee { 
    char *name; 
    char *surname; 
}; 

int main() { 
    struct employee worker; 
    worker.name = "Robert"; 
    worker.surname = "Woz"; 

    printf("\n"); 
    printf("%s", worker.name); 
    printf("\n"); 
    printf("%s", worker.surname); 
    printf("\n"); 

    char name[] = "Robert"; //declaration of array with using [] postfix 

    for (int i = 0; i < 7; i++) { 
     printf("%c", name[i]); 
    } 

    printf("\n"); 

    char *surname = "Woz"; //declaration of array wit using char* pointer 

    for (int i = 0; i < 4; i++) { 
     printf("%c", surname[i]); 
    } 

    printf("\n"); 

    return (0); 
} 

выход программы:

Robert 
Woz 
Robert 
Woz 
+0

C или C++? Выбери один. –

+0

'char * surname' не объявляет массив; он объявляет указатель. – melpomene

+0

'char * surname =" Woz ";' создает строковый литерал статического времени жизни и назначает 'surname', чтобы указать на него. 'char name [] =" Robert ";' создает массив символов ограниченного времени жизни, массив _not то же самое, что и указатель_, и поэтому у массива есть дополнительная информация, то есть размер, где указатель не знает, как много памяти, на которую он указывает. – George

ответ

2

Прежде всего, включать стандартные заголовки библиотеки используют <header.h> вместо "header.h". При использовании кавычек компилятор будет пытаться найти заголовок в каталоге файлов. При использовании <> компилятор ищет заголовок в вашем каталоге include.

Во-вторых, декларация с использованием скобок принимает только char name[];, а не char []name;. Но если вы объявляете этот путь в структуре, вам нужно указать размер, например char name[30];. Вы можете объявлять без размера при объявлении одной переменной и инициализации ее строковым литералом, поэтому компилятор выведет размер из строкового литерала. Пример: char name[] = "Robert";.

В-третьих, разница в объявлении char* name от объявления char name[30] является то, что в первом случае вы объявить указатель на последовательность символов в памяти, в то время как во втором пути, вы объявить массив фиксированного размера. Обратите внимание, что назначение массива фиксированного размера меньшему строковому литералу (или большему) после его инициализации может привести к ошибке, а присвоение указателя char10 позволит вам определить его в любом литерале строковой строки.

+0

Но размер массива, объявленный таким образом, 'char * name' будет статическим, или я могу его повторно использовать, используя' realloc(); 'function? –

+0

'char * name' не определяет массив вообще, а просто указатель, который *** может *** указывать на символ' char', который *** может *** быть первым элементом массива, *** Если ***, вы указали на это. – alk

+0

Для использования 'realloc' в чем-либо, вам сначала нужно использовать' malloc' или 'calloc' и присваивать ему возвращаемое значение' malloc'. И после использования переменной, которую вы назначили 'malloc', вам нужно использовать' free' на ней. Если вы планируете использовать распределение динамической памяти с помощью семейства 'malloc', используйте символ' char * '. Если вы намерены переназначить переменную для строковых литералов различного размера, вы также должны использовать 'char *'. –

0

Если вы используете char name[] в структуре, ваш компилятор не знает размер вкладки char. Вот почему вы должны использовать указатель в свой тип структуры, или вы можете использовать

char name[MAX_SIZE]; в вашем виде структуры.

Но я Recommand с помощью указателей :)

+0

Но указатель его только переменная, которая хранится адрес памяти, vs worker.surname хранится массив, который имеет некоторое количество элементов char, когда зарезервирована память для строки? В этот момент: 'worker.surname =" Woz ";'? –

+0

имя массива - это указатель, который хранит адрес первого элемента массива или нет? –

0

В соответствии с вашим вопросом.

  1. Данные заголовка файла. < > вместо " "
  2. Я не думаю, что C разрешает Array объявлять как Java. char name[] = " "; вместо char []name=" ";

    *name - просто указатель.