2013-06-26 2 views
3
의 배열에 전달하는

내 기능 :어떻게 정수 포인터

int f1(int* r1, int* r2, int* r3, int* r4) { 

    *r1 = 1; 
    *r2 = 343; 
    *r3 = 34; 
    *r4 = 3; 

    return c; // c = 1 if success 
} 

caller: 
f1 (&r1, &r2, &r3, &r4); 

내가 네 int 포인터의 배열을 전달해야한다, 내 기능을 단순화하고 싶다면? 아니면 4 개의 배열로해야합니까 int?

int f1(int* r1[4])? 

또는

int f1(int r1[4])? 

감사합니다.

답변

4

함수에 전달 포인터로 배열 붕괴 이후, 배열 할 것이다 :

배열 함수의 매개 변수에 사용되는
void f(int *p) 
{ 
    p[0] = 1; 
    p[1] = 2; 
    p[2] = 3; 
    p[3] = 4; 
} 

int arr[] = { 0, 0, 0, 0 }; 
f(arr); 
+1

이 솔루션은 안전하지 않습니다. – kotlomoy

+1

@kotlomoy 어떤 의미입니까? –

+1

'p [4] = 5' - 코드에 약간의 추가로 버퍼 오버 플로우가 발생합니다. 그것을 인식 할 힌트가 없습니다. 확실히 반대로, void f (int p [4])의 경우에는 좋은 컴파일러 또는 코드 분석기 또는주의 깊은 프로그래머가 버퍼 오버플로를 catch합니다. – kotlomoy

0

, 그것은 포인터입니다. 함수에 전달하면 컴파일러는 1D 배열의 크기를 걱정하지 않는다 .Because 그래서

int f(int *p) == int f(int r1[]) 

당신은 int f(int r1[4])를 작성할 필요가 없습니다.

int f1(int* r1[4]) == int f1(int **p) // That's not what you want. 
+0

"컴파일러가 배열의 크기를 신경 쓰지 않습니다."- 반은 사실이고, 2D 배열은 함수에 전달합니다.) – Nobilis

+0

예, 내 잘못입니다. –

0

이렇게 진정한 C99의 방법은 가지고있다 :

int f(int p[static 4]) 
{ 
    p[0] = 1; 
    p[1] = 2; 
    p[2] = 3; 
    p[3] = 4; 
    return c; 
} 

대괄호 안의 static 4 함수가 적어도 4 개 요소들의 어레이를 기대 컴파일러에 나타낸다. 컴파일시에 f에 전달할 값에 적어도 4 개의 요소가 없다는 것을 알면 clang은 경고를 발행합니다. GCC도 경고 할지도 모르지만 나는이 컴파일러를 자주 사용하지 않는다.

0
  • 내 함수를 단순화하려면 int 포인터를 배열로 전달해야합니까? 아니면 4 int의 배열로해야합니까? 당신이 배열의 크기를 생략 할 수 있습니다 포인터로 배열 붕괴 이후

배열의 INT

int f1(int r1[4]) 
{ 
    p[0] = 1; 
    p[1] = 2; 
    p[2] = 3; 
    p[3] = 4; 
} 

int f1(int r1[]) 

또는

int f1(int * r1) 

그러나 나쁜 방법입니다 . 예를 들어, p[4] = 5은 버퍼 오버 플로우를 일으키고, 컴파일러는 버퍼 크기를 알지 못하면 catch 할 수 없습니다.

관련 문제