2014-12-30 2 views
-1

char을 가변 길이로 정의 할 수 있습니까?가변 길이의 문자

나는 길이가 25 인 char "이름"(구성원 이름은 struct 임)을 가지고 있지만 임의의 문자열을 생성하기 때문에 값 1과 25 사이의 가변 길이가되고 싶습니다. 크기가 같고 항상 같은 길이 (25)가 아닌 char입니다. 이 방법의 매개 변수 중 하나는 sizeof(n.name)입니다.

주 : nstruct (struct person n)입니다.

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

사람 :

struct "사람은"이런 식으로 정의된다?

+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에서

(6.7.2.1 구조와 조합 지시자)

가요 어레이 부재는 무시된다. 특히, 구조체의 크기는 유연한 배열 구성원이 누락 된 것처럼 보이지만, 누락이 의미하는 것보다 더 많은 후행 패딩을 가질 수 있습니다. How 어, 언제? (또는 ->) 연산자는 왼쪽 피연산자가 유연한 배열 멤버가있는 구조 ( 까지)이고 오른쪽 피연산자 인 은 해당 멤버의 이름을 지정하며 그 멤버가 가장 긴 배열로 동일한 요소 유형)을 사용하여 액세스하는 객체보다 큰 구조로 만들 수 있습니다. 배열의 오프셋은이 이 대체 배열의 오프셋과 다를지라도 플렉시블 배열 구성원의 배열로 유지됩니다. 이 배열에 에 요소가없는 경우 하나의 요소가있는 것처럼 작동하지만 해당 요소에 액세스하려는 시도가 있거나 포인터가 하나 생성 된 경우에는 동작이 정의되지 않습니다.

그리고 그것의

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

이가 할 수있는 더 좋은 방법을 할당 할 수의 예는있다 문자열 라이브러리를 사용하고 string 유형의 변수 'name'을 선언하십시오.

#include<string> 

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

char[25]는 포함 제로 (24) 사이의 길이의 C 문자열을 (하나 개의 문자가 '\0' 종결에 필요한) 저장할 수 있습니다.

  • 유연한 배열 구성원을 사용하거나
  • 를 사용하여 포인터 :

    당신은 두 가지 솔루션 중 하나를 사용할 수 있습니다.

첫 번째 솔루션은이 struct의 나머지 부분과 함께 name을 유지 할 수 있습니다,하지만 당신은이 struct의 배열 할 수 없을 것입니다 : 유연성에 대한 자세한 내용은

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

this Q&A 참조 배열 구성원. 유연한 배열 멤버를 사용하려면 C99와 호환되는 컴파일러가 필요합니다.

두 번째 솔루션은 약간 더 많은 메모리가 필요하지만 struct의 크기는 가능한 배열을 사용할 수 있도록 변경되지 않습니다

struct person{ 
    int c; 
    char *name; 
}; 
관련 문제