Malloc 내부 함수 호출을 받을 것으로 보인다 해방에 반환?
문제
내가 생각하는데 그것은 가장 기본적인 경우:
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;내가 추천하지 않는(&)솔루션입니다.