2012-02-22 3 views
1

C 함수에 이미 포인터가 선언되어 있지만 아직 값이 할당되지 않은 경우를 가정 해 보겠습니다. 우리는 예제를 위해 int를 사용할 것이다.C 고정 크기 배열의 기존 포인터

int *ptr; 

기능의 목표는 ptr 힙에 동적 메모리, 그래서 아무 malloc 전화를 할당 할 수 없습니다. 대신 고정 된 크기의 배열 n을 가리 키기를 원합니다. 나는과 같이이 작업을 수행 할 수 알고 : 우리는 기능, 즉, 많은 포인터 필드의 모든 필요 구조체이 여러 번 수행해야하는 경우

int arr[n]; 
ptr = arr; 

그러나, 코드를 읽고 매우 지저분한 하드 얻을 수 고정 된 길이의 배열을 가리 키기 위해. 한 줄로이 작업을 수행하는 더 좋은 방법이 있습니까? 나는 아래에 비슷한 생각했지만, 너무 모호하고 uncompilable 같습니다

int *ptr; 
// Many other things happen in between... 
ptr[n]; 

이 *** 수정 *** 여기
, 좀 더 답변을 안내하는 데 도움이 될 수 아래의 추가 정보 (말을하지 현재의 답변이 좋지 않음). 내 유스 케이스에서는 포인터가 구조체에 선언되고 함수에서 포인터를 배열에 할당하려고합니다. 나는 (모든 포인터는 고정 길이 배열을 가리 키도록) 아래의 코드보다이 작업을 수행 할 수있는 간단한 방법이 있는지 알고 싶어 :이 명확한 경우처럼 보인다

struct foo { 
    int* a; 
    short* b; 
    char* c; 
    ... 
}; 

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n]; 
    f.a = tempArr1; 
    short tempArr2[n]; 
    f.b = tempArr2; 
    char tempArr3[n]; 
    f.c = tempArr3; 
    ... 
} 
+0

이것은 모호한 것 이상입니다. 메모리가 런타임이나 컴파일 타임에 할당되지 않은 경우 메모리 오류가 발생할 수 있습니다. – Hogan

+0

왜'ptr'이 필요한가요? 왜 'arr'을 직접 사용하지 않는가? –

+0

@JamesMcLaughlin - 그는 어떻게 보이는지 싫어 해요. – Hogan

답변

1

배열을 선언하고 하나의 선언에서 기존 포인터에 할당 할 수 없습니다.그러나이처럼 새로 선언 포인터 배열 포인터를 할당 할 수

#define DECL_ASSIGN_INT_ARRAY(name,size,pointer) int name[(size)]; pointer = name; 
:

단일 회선 한도 내에서 주장하는 경우
int arr[n], *ptr = arr; 

,이 같은 못생긴 매크로를 사용할 수 있습니다

이 한 줄 짜기의 선명도는 게시물의 두 줄짜리 버전보다 훨씬 낮으므로 초기 버전을 유지합니다.

편집 또 다른 옵션은 다음과 같이 선언에 사용되지 않은 포인터 변수를 생성 및 초기화에 포인터를 할당하는 것입니다

(질문의 편집에 응답) :

void func(void) { 
    struct foo f; 
    int n = ...; 
    int tempArr1[n], *tempPtr1 = f.a = tempArr1; 
    short tempArr2[n], *tempPtr2 = f.b = tempArr2; 
    char tempArr3[n], *tempPtr3 = f.c = tempArr3; 
    ... 
} 
0

당신의 필요에있어 어디에 약간의 리펙토링. 비슷한 문인 extract them into a new function (구조체 필드와 구조체 필드가 ​​가리키는 데이터 참조)를 전달하고이 새로운 함수에 의미있는 이름을 지정합니다.

이것은 몇 주 또는 몇 달 후에 잊어 버릴 수있는 멋진 포인터 산술 바로 가기보다 유지 관리가 쉽고 읽기 쉽습니다.

0

예를 들어 ptrarr의 차이는 ptr의 값을 변경할 수 있다는 것입니다. 그래서 ptr 배열을 통해 이동하려는 것 같아요.

어떻게 이것에 대해 :

int arr[n], id=0; 

그리고 당신은 id의 값을 변경하고 ptrarr+id를 사용합니다.

0

매크로를 사용하는 방법입니다. 이것이 내가이 "예쁘게"수 있지만 매크로없이 유지하기 쉬울 것이라고 생각 도움이되는 이유 (테스트되지 않은)

#define autoptr(name,size) int Arrayname[size]; name = Arrayname; 

같은 뭔가 내가 분명하지 않다. 일반적으로 당신이 실제로하고있는 것을 감추는 것은 나쁜 일입니다.