2011-03-10 11 views
0

아래 코드에서 구조체를 초기화하는 데 어려움이 있습니다. 이 작업을 수행 할 수 있습니까, 또는 정말 구조체에 5 문자 문자열을 memcpy (urg)해야합니까?구조체 초기화 오류

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}}; 

최초의 경고가 사라집니다 : 나는 초기화처럼 포장하는 경우 초기화 캐스트

없이 포인터의 정수를 만든다 :
경고가 초기화 주위에 괄호가 없습니다. 두 번째 경고는 그렇지 않습니다. 그리고, 따라서 구조체는 희망대로 초기화되지 않습니다.

미리 도움을 청하십시오.

+0

죄송합니다. const char * MyString = "mnopq"; (중괄호 없음) – user654077

+0

@ user654077 : 죄송합니다. 귀하의 질문과 의견은 서로 모순됩니다. 'const char * MyString = "mnopq"'이면 NULL 종료 문자열입니다. 그러나 코드 주석에서 그렇지 않다고 말합니다. ??? 원하는 것을 결정하고 질문을 편집하십시오. 이때는 엉망입니다. – AnT

답변

3

포인터로 문자 배열을 채우려고합니다. MyString은 배열 대신 const char *로 간주됩니다. 구조체의 타입을 const char * x로 변경하면 트릭을 수행해야합니다. 또한 MyString은 실제로 NULL로 끝나는 문자열입니다. 컴파일러는 끝에 여분의 NULL 바이트를 메모리에 설정 한 다음 MyString을 const char *와 같이 처리합니다.

대신 const를 숯불 *의 문자의 x는 [5], 당신은 몇 가지 방법으로 초기화 할 수하고자 할 경우

,

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

또는 당신은 할 수

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

첫 번째에게 중괄호 집합은 구조체 멤버를 초기화하기위한 것이며, 두 번째 집합은 char 배열 멤버를 초기화하기위한 것이기 때문에 각 멤버 (char)를 개별적으로 설정해야합니다.

+0

위의 코드에서 식별자를 편집했습니다. 한 가지 다른 점은 MyString [인덱스] 버전은 정크를 끝으로 인쇄하지만 첫 번째 버전은 그렇지 않습니다 (예 : mnopq|ah|) – Rob

+0

NULL 종결자가 없으므로 맞습니다.하지만 첫 번째 예제의 끝에는 NULL이 없어야합니다 ... 나는 배열로 문자열을 출력하기 위해 정의 된 인쇄 함수를 사용한다고 언급 한 것 같지 않습니다. – DavidMFrey

4

"mnopq"은 배열이며 const char * MyString은 아닙니다. 당신의 접근 방식은 정수 값에 포인터MyString을 변환하고 x의 첫 번째 요소에 할당하는 반면

struct MyStruct foo = {"abcde"};는 작동합니다.

0

MyStruct 유형의 변수를 선언하고 해당 값을 해당 문자열에 할당해야합니다. 이 작동합니다 :

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 *을 사용하거나 memcpy/strcpy를 사용하여 정보를 가져와야합니다.

0

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; 
} 
관련 문제