문제

내가 생각하는데 그것은 가장 기본적인 경우:

int main(int argc, char ** argv) {
  int * arr;

  foo(arr);
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

void foo(int * arr) {
  arr = (int*) malloc( sizeof(int)*25 );
  arr[3] = 69;
}

출력 this:

> ./a.out 
 car[3]=-1869558540
 a.out(4100) malloc: *** error for object 0x8fe01037: Non-aligned pointer
                         being freed
 *** set a breakpoint in malloc_error_break to debug
>

킬 수 있는 사람이 있다면 빛을 발산에 대한 이해 실패,그것은 크게 감사합니다.

도움이 되었습니까?

해결책

당신이 통과하여 포인터 값이지 참조에 의해,그래서 당신이 무엇으로 제공 내부 foo 지 않을 것이 차이를 만들 외부 foo-기능입니다.로 m_pGladiator 쓴 방법 중 하나를 선언하여 참조하여 포인터이(만에 가능한 C++btw.C 는지에 대해 알고 참조):

int main(int argc, char ** argv) {
  int * arr;

  foo(arr);
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

void foo(int * &arr ) {
  arr = (int*) malloc( sizeof(int)*25 );
  arr[3] = 69;
}

다른(더 이럴)방법을 통과하지 못하는 포인터로 인수지만 대한 포인터를 반환:

int main(int argc, char ** argv) {
  int * arr;

  arr = foo();
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

int * foo(void ) {
  int * arr;
  arr = (int*) malloc( sizeof(int)*25 );
  arr[3] = 69;
  return arr;
}

고 전달할 수 있습니다 포인터를 포인터이다.는 C 방식을 통과하여 참조.을 복잡하게 구문을 조금만 잘하는 방법 C...

int main(int argc, char ** argv) {
  int * arr;

  foo(&arr);
  printf("car[3]=%d\n",arr[3]);
  free (arr);
  return 1;
}

void foo(int ** arr ) {
  (*arr) = (int*) malloc( sizeof(int)*25 );
  (*arr)[3] = 69;
}

다른 팁

당신은 할당된 제공에 foo,하지만 그는 포인터 값을 저장하에서 호출 스택입니다.당신이 원하는 경우 이를 위해,그것은 다음과 같다:

void foo( int ** arr) {
    *arr = (int *)malloc( sizeof(int) * 25 );
    (*arr)[3] = 69;
}

고요,단순히 전달하는 포인터를 foo(foo(&arr))

foo 을 받는 지역의 사본 int 형 포인터,alloactes 메모리를 유출하는 메모리 할 때가 범위를 벗어납니다.

한 방법이 푸를 반환하는 포인터:

int * foo() {
  return (int*) malloc( sizeof(int)*25 );
}

int main() {
    int* arr = foo();
}

또 다른 전달하는 것입 foo 포인터를 포인터

void foo(int ** arr) {
   *arr = malloc(...);
}

int main() {
    foo(&arr);
}

C++에서 그것은 간단한 수정하 foo 을 받아에 대한 참조를 포인터이다.만을 변경할 필요가에서는 C++를 변경 foo 하기

void foo(int * & arr)

때문에의 전달에 의해 포인터 값을 제공 포인터 내에 주요하지 않을 가리키는 할당되는 메모리.이 두 가지를 의미합:당신이 자신을 메모리 누수(아니오,메모리 없이 해방 후에는 기능 foo 완료)때,그리고 당신은에 액세스 포인터를 제공 내의 주요 당신은에 액세스하는 일부를 임의의 범위를 메모리,그래서 당신을 얻지 않는 3 인쇄되고,따라서 무료()일을 거부합니다.당신이 운이 좋다면 당신이 얻을하지 않았다 segmentation fault 에 액세스할 때 arr[3]안됩니다.

값을 변경할 수 없습의 인수(arr)는 경우 그것은 전달되지 않습에 참조로(&).일반적으로,당신이 원하는 것을 반환하는 포인터를,그래서 당신의 방법을 이어야 한다:

arr=foo();

그것은 나쁜 주주하려고 할당 arguments;내가 추천하지 않는(&)솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top