C의 동적 배열 — malloc과 realoc에 대한 제 이해가 맞습니까?
C에서 동적 1D 배열을 만드는 방법을 배우고 있습니다.아래 코드는 다음을 수행하려고 합니다.
- 사용.
malloc
, 길이의 동적 배열을 만듭니다.10
, 유형의 가치를 가지고 있는double
. - 배열의 각 항목을 다음으로 설정합니다.
j/100
위해서j = 0, 1,..., 9
. 그럼 출력해주세요. - 다음을 사용하여 배열 끝에 빈 항목 추가
realloc
. - 새 항목을 다음으로 설정합니다.
j/100
각 항목을 다시 인쇄합니다.
테스트:
double* data = (double*)malloc(10*sizeof(double));
for (j=0;j<10;j++)
{
data[j]= ((double)j)/100;
printf("%g, ",data[j]);
}
printf("\n");
data = (double*)realloc(data,11*sizeof(double));
for (j=0;j<11;j++)
{
if (j == 10){ data[j]= ((double)j)/100; }
printf("%g, ",data[j]);
}
free((void*) data);
문의사항
이거 제가 코딩하는 거 맞나요?
사용한 자습서
malloc
을 넣지 않고(double*)
맨 앞에예.,int *slot;
포인터 = malloc(2*size of (int));
Visual Studio 2010, Windows 7에서는 컴파일이 되지 않습니다.오류 메시지는
유형 void의 값을 유형 엔터티에 할당할 수 없습니다.
int
.
왜 저한테는 안되고 그런 튜토리얼에는 안되나요?그들이 사용하고 있는 컴파일러들이 자동적으로 파일을 채우기 때문이라고 추측하는 것이 맞습니까?(int*)
예를 들어 그들을 위해?
가까워졌습니다.
C(적어도 1989년 버전의 표준 이후)에서, 이전의 캐스트.malloc
그리고.realloc
C는 유형의 값을 변환할 수 있으므로 불필요합니다.void *
로.int *
깁스를 하지 않고이것은 C++의 경우에는 해당되지 않으므로 오류를 기준으로 이 코드를 C가 아닌 C++로 컴파일하는 것처럼 들립니다.코드를 C로 컴파일하는 방법을 결정하려면 VS2010의 설명서를 확인합니다.
다음은 제가 a를 쓸때 선호하는 스타일입니다.malloc
호출:
double *data = malloc(10 * sizeof *data);
식의 종류 이후로*data
가double
,sizeof *data
와 동치입니다.sizeof (double)
. 이것은 또한 당신이 조정할 필요가 없다는 것을 의미합니다.malloc
호출 유형:data
변화들.
에 관해서는.realloc
호출, 결과를 임시 포인터 값에 할당하는 것이 더 안전합니다.realloc
버퍼를 확장할 수 없으면 NULL을 반환하므로 쓰기가 더 안전합니다.
double *tmp;
...
tmp = realloc(data, 11 * sizeof *data);
if (!tmp)
{
// could not resize data; handle as appropriate
}
else
{
data = tmp;
// process extended buffer
}
마이크로소프트의 C 지원은 1989년 버전의 C 언어로 끝납니다. 그 이후로 두 번의 C 언어 표준 개정이 있었지만, 몇 가지 새로운 기능을 도입하고 오래된 기능은 사용하지 않게 되었습니다.따라서 일부 C 컴파일러는 혼합 선언 및 코드, 가변 길이 배열 등과 같은 C99 기능을 지원하지만 VS2010은 지원하지 않습니다.
1) 이거 제가 코딩하는 거 맞나요?
주로. 그런데.data = (double*)realloc(data,11*sizeof(double));
다음 경우 할당된 메모리에 대한 참조가 손실됩니다.realloc
실패합니다. 반환 값을 유지하려면 임시 포인터를 사용해야 합니다.realloc
그리고 확인해 보세요.NULL
( 한품을야다다해야 )의 반환 malloc
).
2) 제가 찾은 튜토리얼은 앞에 (더블*)을 넣지 않고 malloc을 사용합니다.
주식회사,malloc
a를 void*
암시적으로 다른 포인터 유형으로 변환할 수 있으므로 캐스트가 필요하지 않습니다(오류를 숨길 수 있는 캐스트 때문에 광범위하게 사용할 수 없음).비주얼 스튜디오는 캐스트가 필요한 곳에 코드를 C++로 컴파일한 것으로 보입니다.
Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δmalloc()
.
, 에서 하는 은 입니다 을 입니다 에서 은 을 하는 malloc()
◦ 이 더 입니다.이것이 더 나은 방법입니다.
double* data = malloc(10 * sizeof *data);
언급URL : https://stackoverflow.com/questions/12675919/dynamic-array-in-c-is-my-understanding-of-malloc-and-realloc-correct
'programing' 카테고리의 다른 글
AJAX를 통해 비디오를 읽은 후 blob을 (0) | 2023.09.18 |
---|---|
재작성이 있는 동일한 슬러그를 사용하는 사용자 지정 게시물 유형 및 분류법 (0) | 2023.09.18 |
약한 자아는 어디로 가는 거지? (0) | 2023.09.18 |
Oracle SQL: 열 이름이 지정된 테이블 이름을 어떻게 찾습니까? (0) | 2023.09.18 |
중첩된 클래스의 범위? (0) | 2023.08.29 |