2013-04-14 2 views
1

여기 다이나믹 어레이의 할당 해제?

while(temp[i]!=0){ 
    while(temp[i]!=3){ 
     FrameBuffer[a]=temp[i]; 
     i++; 
     a++; 
    } 
    FrameBuffer[a]=temp[i]; 
    printf(" Framebuffer: %s ", FrameBuffer); 
    result=layer1(FrameBuffer,PacketAction); 
    i++; 
    a=0; 
} 

문제

내가 프레임 버퍼 루프 (프레임 버퍼의 크기는 루프의 시작에 0이다) 동안 내부를 통해가는 때마다 재설정되고 싶어한다는 것입니다 ... 내가 함께 일하고 코드입니다. 무료 (FrameBuffer)를 사용하여 시도했지만 배열을 두 번 이상 해제했기 때문에 오류가 발생합니다. FrameBuffer = NULL을 쓰려고했으나 작동하지 않았습니다. 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다! 당신은 단지 각각의 내부 루프가 시작되기 전에 프레임 버퍼를 초기화해야하는 경우

+1

특히 'FrameBuffer'를 어떻게 선언하는지 더 자세히 보여주십시오. –

+0

또한 문자열 종결 문자' '\ 0''을 추가하지 않으면 문자열로 사용할 수 없습니다. –

+0

나는 이것을 다음과 같이 선언한다 ... char * FrameBuffer = calloc (2048, sizeof (char)); – user1819301

답변

2

, memset는 used- 될 수 있습니다

while(temp[i]!=0) { 
    memset(FrameBuffer, 0, sizeof(FrameBuffer)); 

    while(temp[i]!=3) { 
+0

흠, 그 시도했지만 여전히 FrameBuffer 내용을 비우지 않습니다. – user1819301

+0

코드를 테스트 한 결과 작동했습니다. printf 문이나 FrameBuffer의 내용을 확인하는 데 사용되는 모든 것이 코드의 올바른 위치에 있습니까? – suspectus

+0

그래서 memset 트릭을 했어. 유일한 문제는 "sizeof (FrameBuffer)"이었지만, StrLen으로 변경했을 때 제대로 작동했습니다. 도움을 주셔서 대단히 감사합니다. C에서 새 키워드에 대해 배울 때 항상 즐겁습니다. – user1819301

0

당신이 선언을 표시하거나 입력 문자열의 특히 좋은 설명을 제공하지 않기 때문에 , temp, 당신이 뭘하고 있는지 알기가 약간 어렵습니다.

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 

extern int somefunc(const char *fb, int pa); 
extern int layer1(const char *fb, int pa); 

int somefunc(const char *temp, int PacketAction) 
{ 
    int rc = 0; 
    char *FrameBuffer = calloc(2048, sizeof(char)); 
    if (FrameBuffer != 0) 
    { 
     int i = 0; 
     while (temp[i] != '\0') 
     { 
      int a = 0; 
      while (temp[i] != 3) 
       FrameBuffer[a++] = temp[i++]; 
      FrameBuffer[a++] = temp[i++]; 
      FrameBuffer[a] = '\0'; 
      assert(a < 2048); 
      printf("Framebuffer: %.*s\n", a, FrameBuffer); 
      int result = layer1(FrameBuffer, PacketAction); 
      if (rc == 0) 
       rc = result; 
     } 
    } 
    return rc; 
} 

아마도 충분할 것입니다. 함수 layer1FrameBuffer에 null로 끝나는 문자열을 가져옵니다 (데이터의 길이를 확인할 수있는 다른 방법은 없습니다).

외부 루프의 범위에 a을 선언하면 루프 끝 부분에서 다시 초기화 할 필요가 없습니다. 카운터를 증가 시키려면 a++i++을 사용했습니다. 숙련 된 C 프로그래머에게 가독성을 잃지 않으면 서 조밀 한 표기법을 사용할 수 있습니다. 비록 초보 프로그래머가 처리하기가 좀 더 어려울 수 있다고 인정합니다. 그럼에도 불구하고 관용구는 배우는 가치가 있습니다.

내부 루프가 '\0'과 3 (일명 '\3' 또는 '\003')을 확인해야하는지 궁금합니다. 나는 끝이 아닌 temp에 null이 나타날 수 있는지 여부를 알아야합니다. 표시된 코드는 FrameBuffer의 오버플로가 없는지 유효성 검사를 수행하는 데 걸리는 시간입니다. 함수가 입력 temp의 길이를 들었다 경우 더 계속 될 것이다 :

void somefunc(const char *temp, size_t templen, int PacketAction) 

코드가 더 탄력적으로 기록 될 수있다. 아마도 strlen(temp)을 사용할 수 있지만 사용 가능한 정보에서 절대적으로 명확하지는 않습니다.