2 차원 배열의 차원을 받아들이는 C 언어의 함수 (간단히 말해서, nxn 배열을 말함)를 동적으로 배열에 할당 한 다음 반환합니다.C에서 배열을 동적으로 할당하는 함수 - 둘 사이에 차이가 있습니까?
여기에 메모리를 할당하는 것은 다른 곳에서 해방해야 할 필요가 있기 때문에 시작하는 것이 좋지 않은 것으로 간주 될 수 있지만 큰 문제는 아니라고 생각합니다.
변화 1 - 로컬/반품 배열을 할당, ** 변수 함수 INT를 정의 : 말했다 기능의 두 가지 변화와 관련된 장점/단점이 있는지 궁금하네요
int **create_array(int n) {
// define array pointer, allocate array...
int **a_ = (int**)calloc(n,sizeof(int*));
for (int i = 0; i < n; i++)
a_[i] = (int*)calloc(n,sizeof(int));
return a_;
}
int main() {
int n = 3;
int **array2d = create_array(n)
printf("First element: %d%c",array2d[0][0],'\n');
// do stuff... etc...
}
변화 2 -/반환 배열 할당에서 아웃 INT ** 매개 변수에 추가 기능 : 분명히
int **create_array_2(int **a_, int n) {
// allocate array...
a_ = (int**)calloc(n,sizeof(int*));
for (int i = 0; i < n; i++)
a_[i] = (int*)calloc(n,sizeof(int));
return a_;
}
int main() {
int n = 3;
int **array2d;
array2d = create_array_2(array2d,n);
printf("First element: %d%c",array2d[0][0],'\n');
// do other stuff... etc...
}
들이 같은 결과를 반환과 같은 작업을 달성하지만,보다/더 효율적/나은 연습 안전한 것으로 간주 하나입니다 다른? 내 의견으로는 2 차 변형은 일을 조금 복잡하게 보이게하지만 2 개 사이의 실제 차이점과 호출 될 때 스택/힙에서 발생하는 것이 궁금하다. 다행히도 이것은 바보 같은 질문이 아닙니다. 그것은 내가 궁금해했던 것입니다. 누군가 공유 할 통찰력이 있다면, 나는 그것을 감사 할 것입니다.
변화 (2)가 이해되지 않는다 단 하나의 시간이 걸린다는 것이다. 함수에 전달 된 매개 변수의 값을 사용하고 있지 않다면 바로 새 값을 할당하는 것입니다. C에서 "in-out parameters"는 없습니다.참조로 패스를 에뮬레이트하기 위해 포인터를 전달할 수는 있지만, 버전 2에서는 그렇지 않습니다. 어쨌든 필요하지 않습니다. 버전 1 만 사용하십시오. –
표시된 코드에는 2D 배열이없고 하나만 가리킬 수있는 요소는 없습니다. 포인터가 배열이 아닙니다! – Olaf
'int ** a'는 포인터 찾아보기 테이블이 아닌 2D입니다. – Michi