2014-12-30 2 views
-1

Можно ли определить char с переменной длиной?Шар с переменной длиной

У меня есть «название» char (член в struct имени «человек») с длиной 25, но я хочу, чтобы быть переменной длиной между значениями 1 и 25, потому что я хочу, чтобы генерировать случайные строки что char с различными размерами и не всегда с одинаковой длиной (25). Одним из параметров метода является sizeof(n.name).

Примечание: n является struct (struct person n).

struct "лицо" определяется следующим образом:

struct person{ 
     int c; 
     char name[25]; 
    }; 

Anyone?

+0

почему бы вам не использовать символ * имя? – CMPS

+0

, потому что я хочу ограничить длину символа между 1 и 25 – Zombie

ответ

4
struct person{ 
    int c; 
    char name[]; /* Variable length array */ 
}; 

Я думаю, что это должно служить вашей цели.

Иначе вы можете иметь динамическое распределение памяти с помощью

char *name; 

name является указателем и память должна быть выделены, и это может быть сделано с помощью malloc()

+0

Можно ли ограничить длину символа между 1 и 25? – Zombie

+0

@ Zombie Прежде чем записывать значение в 'name', проверьте длину строки – Gopi

2

Вы можете использовать гибкий массив. Он должен быть последним элементом данных структуры.

struct person{ 
    int c; 
    char name[]; 
}; 

Память для структуры с гибким массивом должна распределяться динамически.

От C Standard (6.7.2.1 Структура и объединение спецификаторов)

гибкий элемент массива игнорируется. В частности, размер структуры выглядит так, как если бы элемент гибкой матрицы был исключен, за исключением того, что может иметь более длинную прокладку, чем подразумевалось бы упущение. Howev er, когда a. (или ->) имеет левый операнд, который является (указателем ) структурой с гибким элементом массива, а правый операнд называет этот элемент, он ведет себя так, как если бы этот элемент был заменен самым длинным массивом (с тот же тип элемента), который не сделает структуру больше, чем доступ к объекту; смещение массива должно оставаться равным массиву элемента гибкой матрицы, даже если этот будет отличаться от такового в заменяющем массиве. Если у этого массива нет элементов, он будет вести себя так, как если бы у него был один элемент, но поведение не определено, если предпринимаются попытки доступа к этому элементу или генерирует указатель, который проходит мимо него.

И есть пример его использования

20 EXAMPLE 2 After the declaration: 
struct s { int n; double d[]; }; 
the structure struct s has a flexible array member d. A typical way to use this is: 
int m = /* some value */; 
struct s *p = malloc(sizeof (struct s) + sizeof (double [m])); 
and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if 
p had been declared as: 
struct { int n; double d[m]; } *p; 
(there are circumstances in which this equivalence is broken; in particular, the offsets of member d might 
not be the same). 

Или вы могли бы объявить указатель на символ и динамически выделять только массив сам

struct person{ 
     int c; 
     char *name; 
    }; 
+0

Но так как я могу использовать« sizeof (n.name) »в качестве параметра в моем методе для генерации случайных строк, если char« name »doens't иметь связанный размер? – Zombie

+0

@ Zombie. Вы должны сохранить размер массива либо в каком-либо варибельном, либо в элементе данных структуры. –

+0

Хорошо, спасибо! – Zombie

-1

Лучший способ сделать это использовать библиотеку строк и объявить переменную «имя» строки типа.

#include<string> 

struct person{ 
      int c; 
      string name; 
     }; 
2

char[25] позволяет хранить C строку длины между нулем и 24 включительно (один символ необходим для '\0' терминатора).

Вы можете использовать один из двух решений:

  • Используйте гибкий элемент массива, или
  • Используйте указатель.

Первое решение позволяет сохранить name вместе с остальной частью struct, но вы не смогли бы сделать массивы этих struct с:

struct person{ 
    int c; 
    char name[]; 
}; 

См this Q&A для получения дополнительной информации о гибкой элементов массива. Вам нужен компилятор, совместимый с C99, для использования гибких элементов массива.

Второе решение занимает немного больше памяти, но размер вашего struct не меняется, что позволяет использовать его в массив:

struct person{ 
    int c; 
    char *name; 
}; 
Смежные вопросы