2011-11-25 2 views
3

나는 기능이에 x86 컴퓨터에서 잘 실행 호출realloc과의 86 x86_64의

void *srealloc(void * ptr , int size){ 
    void *tmp = realloc(ptr , size); 
    if(tmp == NULL){ 
     fprintf(stderr,"realloc of %u bytes failed", size); 
     exit(1); 
    } 
    return tmp; 
} 

내 코드를 가지고,하지만 난 컴파일하여 x64 컴퓨터에서 동일한 코드를 실행할 때 나는 세그먼트 폴트를 얻을.

호출되는 방법 이것의 예는 :

line = "Some string"; 
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines)); 
buffer[buffer_lines-1] = line; 

srealloc이 크기 == 상기 segfaulting 컴퓨터 PTR == 0x0으로 8

를 호출 할 때 I는 GDB 끝까지 추적 * 편집 : 는 segfault가에 발생합니다

void *tmp = realloc(ptr, size); 
+1

어떻게'buffer'가 선언 되었습니까? – zneak

+0

라인은 char * – LeeG

+0

입니다.'sizeof (buffer)'는 char_를 가리키는 _pointer의 크기입니다. 올바른 것이기 위해서는'sizeof (char *)'를 사용해야한다. 하나의 타입에 대한 포인터의 크기가 다른 타입에 대한 포인터와 같기 때문에 여기서는 그다지 중요하지 않습니다. –

답변

3

귀하의 전화가 잘 보인다. malloc(), realloc(), calloc() 또는 free()의 크래시는 프로그램의 다른 곳에있는 증상으로, 할당 된 블록의 범위를 넘어 서면 메모리 할당 기능에서 사용하는 하우스 키핑 정보를 밟았습니다.

Valgrind 또는 Purify와 같은 도구로 프로그램을 실행 해보십시오.

+0

Valgrind를 실행 한 후'cp *'가 초기화되지 않았을 때'strncpy (cp, line, strlen (line) +1)'이 나타납니다. 나중에 realloc을 호출했을 때이 부분이 스매싱되는 것으로 가정합니다. Valgrind는 좋은 대화였습니다. – LeeG

0

realloc을 호출하는 코드가 해당 함수의 유효한 프로토 타입 (즉, stdlib.h 포함)인지 확인하십시오.

32 비트에서 64 비트로 전환 할 때 많은 문제는 정수 (프로토 타입이없는 경우 기본 인수)와 포인터 사이의 불일치를 포함합니다. 정수는 64 비트 플랫폼에서 32 비트로 유지되지만 포인터의 크기가 커질 수 있습니다.

포인터가 NULL이고 요청한 크기가 8이라고 명시 했으므로 함수를 사용하는 것이 유효합니다. null 포인터의 realloc은 실제로 malloc과 동일합니다. 그것이 프로토 타입 문제를 의심하는 이유입니다.

또한 을 모두 새 컴퓨터에으로 컴파일하고 있는지 확인하십시오. 32 비트로 컴파일 된 srealloc을 64 비트 컴파일 클라이언트에 연결하려고하면 문제가 발생할 수 있습니다.

+0

Valgrind를 실행 한 후에'strncpy()'에 쓰레기 포인터를 보내면 내 힙이 엉망이되었습니다. 이것은 x86 컴퓨터에서 코드가 실행되는 이유를 설명하지 않지만 어쨌든이 버그의 원인을 발견하게되어 기쁩니다. – LeeG