참고 12_ C 언어 변수 매개 변수 및 메모리 관리 및 명령 줄 매개 변수

변수 매개 변수

때때로, 당신은 이러한 상황이 발생할 수 있습니다, 당신은 가변 인자보다는 미리 정의 된 매개 변수 수와 기능을합니다. C 언어는 특정 요구에 따라 수의 매개 변수를 받아 들일 수있는 함수를 정의 할 수 있습니다, 이러한 상황에 대한 해결책을 제공한다. 다음의 예는 함수의 정의를 보여줍니다.

int func(int, ... ) 
{
   .
   .
   .
}
 
int main()
{
   func(2, 2, 3);
   func(3, 2, 3, 4);
}

제발 함수 참고 FUNC () 마지막 인수는 세 개의 점 (즉, 줄임표를 작성 ... ), 줄임표는 전에 인수 INT 전달 될 변수 매개 변수의 총 수를 나타내는. 이 기능을 사용하려면 사용할 필요 와 stdarg.h 함수 및 매크로의 변수 매개 변수 기능의 구현을 제공하는 헤더 파일을. 다음과 같이 구체적인 단계는 다음과 같습니다

  • 함수의 정의는, 마지막 파라미터는 생략은 맞춤 매개 변수의 전면에 구비 될 수 있고, 생략한다.
  • 함수 정의 만들기 의 va_list의 종류 변수를 유형이 헤더 파일와 stdarg.h에 정의되어 있습니다.
  • 사용 INT 매개 변수와 va_start를의 초기화하는 매크로 의 va_list의 매개 변수 목록으로 변수를. va_start를 매크로는 헤더 파일와 stdarg.h에 정의되어 있습니다.
  • 사용 va_arg를 매크로와 의 va_list 변수는 매개 변수 목록의 각 항목에 액세스 할 수 있습니다.
  • 매크로 사용 va_end의를 제공 청소 의 va_list의 메모리 변수를.

가변 인자를 가진 함수를 작성하고 평균을 반환하기보다 우리가 지금 단계를 수행 보자 :

#include <stdio.h>
#include <stdarg.h>
 
double average(int num,...)
{
 
    va_list valist;
    double sum = 0.0;
    int i;
 
    /* 为 num 个参数初始化 valist */
    va_start(valist, num);
 
    /* 访问所有赋给 valist 的参数 */
    for (i = 0; i < num; i++)
    {
       sum += va_arg(valist, int);
    }
    /* 清理为 valist 保留的内存 */
    va_end(valist);
 
    return sum/num;
}
 
int main()
{
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과를 얻을 수 있습니다. 기능 주목해야한다 평균은 () 첫 번째 파라미터가 가변 파라미터의 갯수가 표시를 전송 때마다 두 번 호출한다. 타원은 가변 인자를 전송하는 데 사용됩니다.

5 = 3.500000, 4, 3, 2 평균
5 보통, 10, 15 = 10.000000

메모리 관리

C 언어는 할당하고 메모리를 관리 할 수있는 여러 가지 기능을 제공합니다. 이러한 기능은 할 수있다 <stdlib.h> 헤더 파일을 찾을 수 있습니다.

아니오. 기능 및 설명
1 *의 공극은 calloc (INT 인분, INT 크기), 메모리 할당을 동적 NUM 연속 길이 사이즈의 공간을, 각각의 바이트는 0으로 초기화된다. 그 결과 NUM 할당되도록 * 메모리의 크기는 바이트의 길이에, 각 바이트의 값은 0이다.
보이드없이 (무효 * 주소) 이 함수는 메모리 블록 어드레스를 동적으로 할당 된 메모리 공간의 방출에 의해 지시 발표한다.
; 무효 * (INT NUM)의 malloc 힙 영역에 데이터를 저장하기위한 소정 메모리 크기를 할당. 이 메모리 공간은 기능의 실행이 완료된 후, 그 값을 알 수 있습니다 초기화되지 않습니다.
4 * realloc을 보이드 (공극 * 주소 INT newSize와) 이 재 할당 함수 메모리의 확장 된 메모리 newSize와 .

참고 : 무효 * 형 포인터의 미정 유형을 나타냅니다. C, C ++, 소정 종류 *는 무효 포인터 형식 변환의 임의의 다른 타입으로 캐스팅 할 수있다.

동적 메모리 할당

프로그래밍 할 때 사전에 알고 있다면 당신은 배열을 정의 할 때, 배열의 크기는, 그래서 쉽다. 예를 들어, 이름의 배열은 당신이 배열을 정의 할 수 있도록, 같은 다음, 100 자까지 수용 :

char name[100];

당신이 미리 알 수없는 경우, 텍스트 요구의 길이가 같은 저장 장치에 관련된 주제의 상세한 설명으로 저장합니다. 여기서는 미정 캐릭터 점이 다음과 같이 필요에 따라 메모리를 할당하는 메모리 크기 및 후속 요구하는 포인터를 정의 할 필요가있다 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 200 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

위의 코드를 컴파일하고 실행되면 다음과 같은 결과를

이름 = 자라 알리
설명 : 자라 알리 클래스 10의 DPS 학생

상기 과정이 또한 사용될 수있다 은 calloc () 아래에 도시 된 바와 같이 기록에 단지의 malloc은 calloc 교체해야

calloc(200, sizeof(char));

메모리의 동적 할당, 당신은 임의의 값의 크기를 완벽하게 제어 할 수있을 때 전달 될 수 있습니다. 이러한 미리 정의 된 크기 배열이 정의되면 당신은 크기를 변경할 수 없습니다.

메모리 크기 및 사용 가능한 메모리를 다시 조정

프로그램이 종료가 자동으로 메모리를 필요로하지 않는 것이 좋습니다 그러나 모든 프로그램에 할당 된 메모리를 해제합니다 운영 체제, 당신은 함수를 호출해야하는 경우 무료 () 무료 메모리를.

또는, 당신은 함수 호출 할 수 있습니다 realloc을 () 증가 또는 할당 된 메모리 블록의 크기를 줄일 수 있습니다. 우리가, realloc을 ()와 () 무료 기능을 사용하여 다시 위의 예를 보자 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假设您想要存储更大的描述信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
 
   /* 使用 free() 函数释放内存 */
   free(description);
}

위의 코드를 컴파일하고 실행되면 다음과 같은 결과를

이름 = 자라 알리
설명 : 자라 알리 DPS를 student.She 클래스 10에

당신은 설명을 저장할 때 사용할 수 있기 때문에 메모리 부족, 추가 메모리, strcat와 () 함수는 오류가 발생 재 할당을 시도 할 수 없다.

명령 줄 매개 변수

프로그램을 실행하는 경우, 명령 라인은 프로그램 C의 값을 전달할 수있다. 이 값은 호출 명령 줄 인수를 그들은 당신이 코드에 하드 코딩 된 값, 그것은 특히 중요하다보다는, 외부 프로그램에서 제어 할 특히, 프로그램에 중요하다.

명령 행 인수는 상기 파라미터, 처리 main () 함수를 사용 ARGC가 전달되는 매개 변수의 개수를 argv와 []는 포인터 배열, 작용점에 전달 각 파라미터이다. 다음은 커맨드 라인 파라미터와 대응 조치가 파라미터에 기초하여 수행되었는지 여부를 체크가 제공되는 간단한 예이다 :

#include <stdio.h>

int main( int argc, char *argv[] )  
{
   if( argc == 2 )
   {
      printf("The argument supplied is %s\n", argv[1]);
   }
   else if( argc > 2 )
   {
      printf("Too many arguments supplied.\n");
   }
   else
   {
      printf("One argument expected.\n");
   }
}

컴파일하고 위의 코드를 실행 매개 변수를 사용하면, 다음과 같은 결과를

$. / 시험의 a.out
공급 인수는 테스트입니다

, 두 개의 매개 변수를 사용하여 컴파일하고 위의 코드를 실행, 그것은 다음과 같은 결과를

$. / a.out의 testing1 testing2
공급이 너무 많은 인수.

매개 변수, 컴파일을 전달하고 위의 코드를 실행하지 마십시오, 그것은 다음과 같은 결과를 생성합니다 :

$. / a.out으로
한 인수가 예상

그것은, 주목된다 argv와 [0] , 프로그램의 이름을 저장 argv와 [. 1] 첫번째 명령 행 인수 포인터를 가리키는가이고, *는 argv는 [N] 마지막 파라미터이다. 당신이 인수를 제공하지 않는 경우는 argc는 매개 변수를 전달하면, 그렇지 않으면 1이됩니다 ARGC은 2로 설정 될 것이다.

공백으로 분리 명령 줄 인수, 복수하지만 사이 만약 파라미터의 송신 파라미터 "따옴표 위치"또는 아포스트로피 '내부되어야 공간과 파라미터 자체. 공간이, 당신은 ""두 번 또는 작은 따옴표에 넣어보기를 통과 할 수있다 "." 이제 위의 예를 다시 보자, A는 큰 따옴표 안에 배치 지나가는 프로그램에 인수 줄 명령 :

#include <stdio.h>

int main( int argc, char *argv[] )  
{
   printf("Program name %s\n", argv[0]);
 
   if( argc == 2 )
   {
      printf("The argument supplied is %s\n", argv[1]);
   }
   else if( argc > 2 )
   {
      printf("Too many arguments supplied.\n");
   }
   else
   {
      printf("One argument expected.\n");
   }
}

간단한 매개 변수를 따옴표로 묶여 매개 변수가 컴파일하고 위의 코드를 실행 공백으로 구분하여, 다음과 같은 결과를 생성합니다 :

$. / a.out의 "testing1의 testing2"

./a.out Progranm 이름
공급 인수는 testing1의 testing2입니다


참조에서 : https://www.runoob.com/cprogramming/c-tutorial.html

추천

출처www.cnblogs.com/rope/p/12110751.html