2017-11-28 26 views
-1

나는이 문제를 가로 질렀다. 나는 문자열을 구조체로 변환하는 함수를 구현했다. 나는이 구조를 가지고 :C에서 구조체에 대한 포인터를위한 realloc()

typedef struct { 
    unsigned a, b; 
    unsigned c, d; 
    } struct_t; 

함수의 제목은 다음과 같다 : 생성 된 새로운 구조에 RETVAL 페이지 포인터 \

struct_t * string_to_struct (char * g) 

; \ retval 변환에 실패하면 NULL을 반환합니다. 변환은 "5 8 10 10"(segmentation fault 오류가 발생했습니다)과 같은 문자열에는 성공하지 못하지만 "5 6 6 7"또는 "4 5 6 8"과 같은 문자열에는 성공합니다. 문제는 구조 p에 대한 포인터에 대한 메모리 할당 내에 있다고 생각합니다. 나는 먼저이 방법으로 페이지에 대한 메모리를 할당에 대한 생각 :

p = (struct_t*)malloc(sizeof(struct_t)); 

을 그리고 나는 그것이 문자열을위한 공간 만들기에 의한 P 메모리를 재 할당에 대한 생각 (일부 문자열이 약 8 바이트 모든 것이 잘 작동하지만 문자열이 약 10 바이트라면 segmentation fault을 얻습니다. 왜냐하면 위의 p와 같이 메모리를 할당함으로써 8 바이트의 공간을 차지하기 때문입니다. realloc() 함수를 사용하여 메모리를 확장하여 구조체를 넣고 문자열의 크기를 지정하기 때문에, 그러나 나는 그것을 올바르게하는 방법을 모른다.

struct_t * string_to_struct (char * g){ 

struct_t * p; /* pointer to new structure*/ 
int n; 
n = sizeof(g); 

if(sizeof(g) > sizeof(struct_t)) 
    p = (struct_t*)malloc(n*sizeof(struct_t)); 
else 
    p = (struct_t*)malloc(sizeof(struct_t)); 

if(g[0] == '\0') /* trivial */ 
    return NULL; 
else     
     (*p).a = g[0]; 
     (*p).b = g[2]; 
     (*p).c = g[4]; 
     (*p).d = g[6]; 

      if((*p).a <= (*p).c && (*p).b <= (*p).d) /* check, the elements of the structure must satisfy those relations.*/ 
       return p; 
      else 
       return NULL; /* convertion not successful */ 

}

그러나 그것은 작동하지 않습니다 : 은 여기 내가 realloc()를 사용하지 않는 기능을 구현하기 위해 시도하는 방법이다. 모든 도움을 미리 감사드립니다.

+0

struct_t, 언어 태그 없음 (C 또는 C++), 코드 없음, 실제 질문 없음에 대한 정의가 없습니다. 미안하지만 이것은 정말로 불분명하고 곧 닫힐 가능성이 있습니다. –

+0

할당 (불필요한 캐스트와 별도)이 좋습니다. 이 오류는 구문 분석에서 가장 많이 발생합니다. 'string_to_struct' 함수의 전체 본문을 보여줍니다. – dbush

+0

'sizeof (g)'는'strlen (g)'와 매우 다릅니다. –

답변

0

첫째, 논리의 비트가 필요하다 : 메모리의

int n; 
n = sizeof(g); 

if(sizeof(g) > sizeof(struct_t)) 
    p = (struct_t*)malloc(n*sizeof(struct_t)); 
else 
    p = (struct_t*)malloc(sizeof(struct_t)); 

정확한 금액이 구조체의 인스턴스에 할당 항상 sizeof(struct_t)입니다. 문자열의 길이는 중요하지 않습니다. 또한 sizeof(g)포인터의 크기가 아니라 문자열의 길이를 제공합니다. 문자열 길이는 strlen(g)입니다.

p = malloc(sizeof(struct_t)); 

가장 큰 문제는 여기에 있습니다 : :이 무엇

(*p).a = g[0]; 
    (*p).b = g[2]; 
    (*p).c = g[4]; 
    (*p).d = g[6]; 

가 ASCII 값을 저장하는 것입니다로 문자열에 특정 문자의 (시스템을 가정하는 것은 ASCII를 사용하는) 당신과 위의가 교체 할 수 있습니다 정수로 구조체. "5 6 6 7"이라는 예제 입력을 받으면 g[0]에는 '5' 문자가 포함됩니다. 이 값의 ASCII 값은 53이므로 p->a의 값은 53입니다. 입력 값이 모두 한 자리 숫자 인 경우 사용하는 인덱스는 해당 숫자가 문자열에있는 위치와 일치하므로 각 숫자의 ASCII 값이됩니다. 문자 '0' ~ '9'의 ASCII 값이 연속적이기 때문에 비교는 예상대로 작동합니다.

"5 8 10 10"과 같은 문자열을 사용하면 위의 자리 위치에 대한 가정이 깨집니다. 따라서 a'5' (53), b'8' (56), c'1' (49), 그리고 d은 공백 (ASCII 32)을 얻습니다. 그렇다면 56이 32보다 작지 않으므로 비교 (*p).b <= (*p).d)이 실패하므로 함수가 NULL을 반환합니다.호출 함수가 NULL이 반환되었는지 확인하지 않기 때문에 아마도 segfault를 얻고있을 것입니다.

문자열을 올바르게 구문 분석하려면 문자열을 토큰으로 분리 한 다음 atoi 또는 strtol을 사용하여 각 부분 문자열을 정수로 변환하십시오.