2012-08-28 5 views
3

구조체 포인터에 문자 배열의 주소를 부여해도 괜찮습니까?배열 주소에 대한 구조체 포인터

typedef struct { 
    int ID; 
    word32 Myports; 
    stripports gd[256] ; 
    }Table; 

    typedef struct { 
    oldxmd used; 
    newip ip; 
    newxmd new; 
    }stripports; 

    char buffer1[256]; 

    Table *tableptr = buffer1 ; 

    tableptr ->ID = 15 ; 
    tableptr ->Myports= somenumber ; 
    tableptr ->gd[0].used = somenumber ; 

힘든 부분은 내가 tableptr가 배열 시작 주소를 받아 들일 이유에 관계 할 수없는 오전입니다! 최선의 방법은 위의 코드가 정확하지 않거나 안전하지 않다는 것입니다.

캐스팅은 나중에 채택되었지만 배열을 허용하는 이유는 무엇입니까?

Table* tableptr = (Table*)buffer1; 

Table *tableptr = buffer1 ; 따라야 많은 테스트 Table* tableptr = (Table*)buffer1;에 의해 대체되었다.

캐스팅하지 않고 struct 포인터가 새로 만든 pointee의 주소가 아닌 다른 값을 취할 수 있습니까 struct?

필자는 저장소에있는 많은 저자가 작성한 일련의 테스트를 가지고 있으며 그 테스트는 매우 혼란 스럽다.

+0

char buffer1[256]; 

을 변경하지만, 직접 버퍼를 수정하려고에 의해 극복 될 수있다 behvaior. – Antimony

+1

버퍼가 '테이블'로 사용되도록 올바르게 정렬되었는지 확인하기 위해 수행 된 작업이 없으므로이 코드는 안전하지 않은 것처럼 보입니다. – Mankarse

+1

그리고'Table'은 버퍼보다 ​​커서 위험한 것처럼 보입니다. – jv42

답변

0

아니요, 괜찮지 않습니다.

캐스트

Table* tableptr = (Table*)buffer1; 

은 "닥치고 해!"컴파일러를 알려줍니다. 그것은 마술처럼 작동하지 않습니다, 그냥 컴파일러가 그것에 대해 불평하지 않습니다.

1

구조체 포인터에 문자 배열 주소를 할당해도 작동하지 않을 수 있습니다. 정렬 문제가있을 수 있습니다. 일부 아키텍처에서는 int 만 짝수 주소에 정렬 할 수 있지만 문자 배열은 일반적으로 모든 주소에서 시작할 수 있습니다.

또한 버퍼 오버런 문제가 있습니다. Table 유형이 문자 배열보다 크면 다른 변수를 덮어 쓰거나 메모리 보호 오류가 발생할 수 있습니다.

이 두 문제는 정의되지 않은 얻을 것입니다 구조체로 다시 읽은 다음 나는 그것이 안전하다 생각

char *buffer1 = (char*)malloc(sizeof Table); 
+0

이 질문에 "C",'#include '태그가 붙어 있기 때문에 캐스팅을 char *로 버리십시오. – Jens