2013-04-26 4 views
2

동적으로 할당 된 구조체 유형 label의 배열을 만들려고 노력 중이며 비참하게 실패했습니다. 내 .H 파일에서, 내가 가진 :C에서 동적으로 할당 된 구조체 배열이 작동하지 않는 이유는 무엇입니까?

label* allLabels = (label*) malloc(sizeof(label) * 10); // line 10 
    int arrayIndex = 0; 

을 마지막으로 나는 같은이 .c 파일의 기능을 가지고 :

typedef struct _label { 
      char name[256]; 
      char type[256]; 
      int address; 
} label; 

내 .c 파일에

, 내가 맨 위에이 있습니다 그는 파일에서 다른 방법으로 사용되는 배열이 구조체 객체를 추가하기위한 것입니다 :

void addLabel(char line[], char type[], int addr) { 
      label database; 
      database.name = line; // line 805 
      database.type = type; // line 806 
      database.address = addr; 
      allLabels[arrayIndex] = database; 
      arrayIndex++; 
     } 

은 기본적으로 그냥 접근 할 라벨의 컬렉션을 갖고 싶어. 누군가 내가 잘못하고있는 것을 이해하도록 도와 줄 수 있습니까? 당신은 문자열 작업 중 하나가 필요

formatBuilder.c:10:3: error: initializer element is not constant 
formatBuilder.c: In function 'addLabel': 
formatBuilder.c:805:18: error: incompatible types when assigning to type 'char[256]' from type 'char *' 
formatBuilder.c:806.18: error: incompatible types when assigning to type 'char[256]' from type 'char *' 
+0

어레이는 포인터가 아닙니다. '= '연산자를 사용하여 배열에 새로운 값을 할당 할 수 없습니다. – Jack

+0

코드에서 '데이터베이스'란 무엇입니까? –

+0

'database'는 내 레이블 객체의 이름입니다 – Laurence

답변

5

당신은 그렇게 char 배열에 할당 할 수 없습니다 :

나는 이러한 오류를 얻고, 나도 필요한 #INCLUDE 문 중 하나를 잊지 않고 예컨대 :

strcpy (database.name, line); // or "->" if database is pointer 

가 (바람직에는 버퍼 오버플 없도록 미리 길이를 확인하거나, 필요에 따라 안전 기능을 사용하여).

특정 미묘한 오류를 숨길 수 있으므로 C에서 malloc의 반환 값을 캐스팅하는 것은 나쁜 형식입니다. 코드가 C++로 컴파일되어야하지만 올바른 범위의 프로토 타입을 가지고 있는지 확인해야합니다. 초기화 오류의 측면에서


, 난 당신이 (어떤 함수 외부) 파일 수준에서 선언 있다고 생각한다. 즉, 정적 저장 기간이 있고 코드가 실행되기 전에 설정되기를 원하기 때문에 함수 호출을 사용하여 초기화 할 수 없습니다.

// At file level: 

label* allLabels = NULL; 

// In your function: 

void addLabel(char line[], char type[], int addr) { 
    if (allLabels == NULL) { 
     allLabels = malloc (sizeof(label) * 10); 
     if (allLabels == NULL) { 
      // malloc failed, do something to recover. 
     } 
    } 
    // And we don't need local storage here, hit the array directly. 

    strcpy (allLabels[arrayIndex].name, line); 
    strcpy (allLabels[arrayIndex].type, type); 
    allLabels[arrayIndex].address = addr; 
    arrayIndex++; 
} 

이 값을 설정하기 위해 일정한 initialiser NULL을 사용하며 다음 그냥 당신이 그것을 처음 사용하기 전에 할당 된 것 확인해야합니다 :

당신은 따라서 주변 그 문제를 얻을 수 있습니다.

+0

아, 끝내 주네! 805와 806에서 오류가 수정되었습니다. 아직 초기화 오류가 있지만 한 걸음 더 가깝습니다. 고맙습니다!! malloc을 캐스팅 한 것이 원인입니까? 아니면 완전히 다른 것입니까? – Laurence

+0

@Laurence, 죄송합니다, 실제로 그 비트를 보지 못했습니다. 그것을 커버하는 답변도 업데이트되었습니다. – paxdiablo

+0

정말 고마워요! – Laurence

1

memcpy을 사용하시기 바랍니다.

memcpy(&allLabels[arrayIndex], &database, sizeof(label)); 
+0

제안 해 주셔서 감사합니다. – Laurence

관련 문제