programing

C의 동적 배열 — malloc과 realoc에 대한 제 이해가 맞습니까?

kingscode 2023. 9. 18. 22:53
반응형

C의 동적 배열 — malloc과 realoc에 대한 제 이해가 맞습니까?

C에서 동적 1D 배열을 만드는 방법을 배우고 있습니다.아래 코드는 다음을 수행하려고 합니다.

  1. 사용.malloc, 길이의 동적 배열을 만듭니다.10, 유형의 가치를 가지고 있는double.
  2. 배열의 각 항목을 다음으로 설정합니다.j/100위해서j = 0, 1,..., 9. 그럼 출력해주세요.
  3. 다음을 사용하여 배열 끝에 빈 항목 추가realloc.
  4. 새 항목을 다음으로 설정합니다.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);

문의사항

  1. 이거 제가 코딩하는 거 맞나요?

  2. 사용한 자습서malloc을 넣지 않고(double*)맨 앞에예.,

    int *slot;
    포인터 = malloc(2*size of (int));

Visual Studio 2010, Windows 7에서는 컴파일이 되지 않습니다.오류 메시지는

유형 void의 값을 유형 엔터티에 할당할 수 없습니다.int.

왜 저한테는 안되고 그런 튜토리얼에는 안되나요?그들이 사용하고 있는 컴파일러들이 자동적으로 파일을 채우기 때문이라고 추측하는 것이 맞습니까?(int*)예를 들어 그들을 위해?

가까워졌습니다.

C(적어도 1989년 버전의 표준 이후)에서, 이전의 캐스트.malloc그리고.reallocC는 유형의 값을 변환할 수 있으므로 불필요합니다.void *로.int *깁스를 하지 않고이것은 C++의 경우에는 해당되지 않으므로 오류를 기준으로 이 코드를 C가 아닌 C++로 컴파일하는 것처럼 들립니다.코드를 C로 컴파일하는 방법을 결정하려면 VS2010의 설명서를 확인합니다.

다음은 제가 a를 쓸때 선호하는 스타일입니다.malloc호출:

double *data = malloc(10 * sizeof *data);

식의 종류 이후로*datadouble,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

반응형