2012-11-12 2 views
2

asprintfrealloc을 모두 사용하는 경우 작동하지 않는 다음 코드가 있습니다.재 인쇄용 asprintf 덮어 쓰기 메모리

내가 점점 오전 오류입니다 : 내가 asprintf를 사용할 때 realloc 사용하는 일부 메모리를 덮어처럼 보이는 연구 한 내용을 바탕으로

*** glibc detected *** a.out: realloc(): invalid old size: 0x006f1430 *** 

. 이것은 asprintf이 안전하고 적절한 문자열 길이를 사용하여 동적으로 할당되기 때문에 나에게 이해가되지 않습니다. asprintf을 사용하지 않으면 프로그램이 제대로 실행되지만, 내 프로젝트에는 asprintf의 기능이 필요합니다.

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

int main() { 
    int ifCount = 1; 
    int stringCount = 1; 
    char** IFs = NULL; 

    //Broken code 
    char* message; 
    asprintf(&message, "Hello: %d", stringCount); 

    //Working code, but not the alternative I want to take 
    //char* message = "Hello"; 

    IFs = (char**) realloc(IFs, sizeof(char*) * ifCount); 
    IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message)); 
    strcpy(IFs[ifCount - 1], message); 

    printf("Message: %s\n", message); 
    printf("Copy: %s\n", IFs[ifCount - 1]); 
    free(message); 
} 
+0

게시물의 이름을 변경하여 여기에 답변을 올리면 질문에'(답변)'을 포함하지 마십시오. – Mike

답변

5

이 :

IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message)); 

오류의 원인 realloc()에 초기화되지 않은 포인터를 전달합니다. 또한

:

  1. 문자열은, (1) 너무 적은 것입니다 위의 할당되어 strlen(message) 문자를 종료 공간이 필요하다는 것을 기억하십시오. 이렇게하면 복사 할 때 strcpy()에서 버퍼 오버런이 발생합니다.
  2. realloc()은 힙 메모리를 할당하는 모든 기능과 마찬가지로 실패 할 수 있습니다. asprintf()에 대해서도 마찬가지입니다.
  3. Don't cast the return value of realloc() in C.
  4. sizeof (char)을 피하십시오. 항상 1이므로 코드에 값을 거의 추가하지 않습니다. 대신 NULL 또는 초기화되지 않은 첫 번째 인수로 realloc를 사용
0

단지로 시작하는 malloc를 사용합니다. realloc 호출이 IFs[ifCount - 1] = (char*) realloc(...) 호출에 필요한 경우

, 다음, 이전 행에 대신 calloc를 사용 - realloc는 적절한 NULL 포인터를 할당 된 메모리 중 적어도 제로 부여되도록 해당.

+1

아니요, all-bits-zero로 초기화되는'calloc()'을 사용하여 포인터에 유효하지 않습니다. 모든 비트 0이 'NULL'포인터에 대한 적절한 메모리 내부 패턴이라는 보장은 없습니다. – unwind

+0

설명해 주셔서 고맙습니다 - 고맙습니다. – prprcupofcoffee