2012-03-07 5 views
1

저는 C 프로그래밍을 처음 접했고 포인터 수학과 혼동을 느낍니다. 배열의 크기가 32 바이트이기 때문에 문자 변수의 크기가 1 바이트이므로 32 characters * 1 byte = 32 bytes입니다. 문제는 앞에서 설명한대로 문자 배열을 가리키는 void 포인터가있는 함수를 가질 때입니다. 나는이 프로그램을 실행하면 0이 그러나, 나는 세그먼트 오류를 ​​얻을 수있는 코드 세그먼트배열을 사용한 포인터 산술

for (count = 0; count < size; count++) 
*((int*) raw_sk + count) = 0 

설정해야 raw_sk 버퍼에 모든 슬롯을 설정해야한다고 생각합니다. 나는 그 주소에 셀 수를 더하는 것이 사실 일 수 있다고 생각했다. 주소에 하나를 추가하면 배열의 다음 슬롯으로 이동하게 될 것이라고 생각했습니다. 누군가 내가 잘못 가고있는 것을 지적 할 수 있습니까? 내가 사용하고있는 기능은 다음과 같습니다. 감사합니다. (대부분의 아마 sizeof(int)==4)하지만, 배열은 size 바이트 큰 총 size*sizeof(int) 바이트 이상

void 
write_skfile (const char *skfname, void *raw_sk, size_t raw_sklen) 
{ 
    int fdsk = 0; 
    char *s = NULL; 
    int status = 0; 
    int count = 0; 
    int size = (raw_sklen); 


    /* armor the raw symmetric key in raw_sk using armor64 */ 
    s = armor64(raw_sk, raw_sklen); 

    /* now let's write the armored symmetric key to skfname */ 

    if ((fdsk = open (skfname, O_WRONLY|O_TRUNC|O_CREAT, 0600)) == -1) { 
    perror (getprogname()); 

    /*scrubs the armored buffer*/ 
    for(count = 0; count < armor64len(s); count++) 
    s[count] = '0'; 

    free (s); 

    /* scrub the buffer that's holding the key before exiting */ 
    for (count = 0; count < size; count++) 
    *((int*)raw_sk + count) = 0; 

    exit (-1); 
    } 
    else { 
    status = write (fdsk, s, strlen (s)); 
    if (status != -1) { 
     status = write (fdsk, "\n", 1); 
    } 

    for (count = 0; (size_t)count < 22; count++) 
    *((int*)raw_sk + count) = 0; 

    free (s); 
    close (fdsk); 

    /* do not scrub the key buffer under normal circumstances 
     (it's up to the caller) */ 

    if (status == -1) { 
     printf ("%s: trouble writing symmetric key to file %s\n", 
      getprogname(), skfname); 
     perror (getprogname()); 

    /* scrub the buffer that's holding the key before exiting */ 

     /* scrub the buffer that's holding the key before exiting MY CODE 
    for (count = 0; count < size; count++) 
    *((int*)raw_sk + count) = 0;*/ 

     exit (-1); 
    } 
    } 
} 

답변

3

포인터를 int 크기만큼 증가시킵니다. 그건 잘못된 것입니다. 배열을 0으로 만들려면 char 크기만큼 증가시킵니다. 더 나은 방법은 memset입니다.

+0

그래서 char의 크기를 어떻게 늘릴 수 있습니까? 나는 컴파일러가 나를 위해 그것을 할 것이라고 생각했다. 분명히 나는 ​​틀렸다. memset 사용법을 살펴 보겠습니다. – tpar44

+0

Memset이 트릭을! 고맙습니다! – tpar44

+0

@ tpar44 :'raw_sk'를'int * '로 캐스팅하고 있습니다. 포인터 산술은 주어진 포인터 유형에 따라 증가하는 방법을 알고 있습니다. 예를 들어, char 포인터에 1을 추가하면 포인터가 1 바이트 씩 증가합니다. int 포인터에 1을 추가하면 4 바이트 씩 증가합니다 (대부분의 경우). 우리는 이것을 일반화 할 수 있고 * n * 타입의 포인터에 * n *을 추가하는 것은 포인터를'n * sizeof (x)'만큼 증가시키는 것이라고 말할 수 있습니다. 그래서'raw '_sk'를'char *'에 던지면 괜찮을 것입니다. 물론, 그것을하기위한 관용적 인 방법은 임시 포인터를 생성하고 단순히'count' 변수를 추가하는 대신 그것을 증가시키는 것입니다. –

0

귀하의 루프 반복합니다. 따라서 세그먼테이션 결함.

0

은 내가 raw_sk 당신이

를 숯불 원하는 포인터 산수가이 경우에, 그래서 형의 크기에 의해 메모리 주소를 이동하여 작동

배열을 숯불을 가리키는 가정 때문에 당신이

*((char*) raw_sk + count) = 0 

을 의미 생각

관련 문제