2016-07-04 5 views
0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

char *func(char * str){ 


    int len; 
    len=strlen(str)+3; 
    str = (char *)realloc(str,len); 
    return str; 


} 

void main(){ 

    printf("str:%s",func("hello")); 

} 

마지막 ans는 "hello"문자열을 인쇄하는 대신 (null) 인쇄합니다. 아무도 왜 그렇게 설명 할 수 있습니까? 오류를 식별 할 수 없습니다. 누구든지 오류를 바로 잡을 수 있고 작동 코드를 알려줄 수 있습니까? 부디!왜이 경우 realloc이 제대로 작동하지 않았습니까?

+1

'void main() {..'당연하지 .... –

+3

재 할당 할 수없는 char *에 대해 realloc을 호출합니다. 따라서 실패하고 NULL을 반환합니다. –

+0

질문에'dynamic-allocation' 태그가 붙어 있지만 아무 것도 보이지 않습니다 ... @WilliamPursell 'char const *'(문자열 리터럴 유형)을 전달하기 위해 경고를 생성하거나 컴파일하지 않아야합니다. func()에? 나는 대부분 모든 경고가있는 C++ 14를 프로그램합니다. 아마도 너무 좋은 타입 안전성에 익숙 할 것입니다 ... –

답변

6

동적 메모리 할당 자 함수 집합에서 이전에 반환하지 않은 포인터를 realloc()으로 전달하기 때문에 프로그램에서 undefined behavior을 호출합니다. C11 챕터 §7.22.3.5, realloc을 함수 따르면

(강조 광산)는

ptr 널 포인터이면 realloc 함수 대한 malloc 기능처럼 동작 지정된 크기. 그렇지 않으면, ptr 경우 이전 메모리 관리 기능에 의해 반환 된 포인터와 일치하지 않거나, 공간이 free 또는 realloc 함수에 대한 호출에 의해 해제 된 경우, 동작은 정의되지 않습니다. [...] 상기

, 호스트 환경의

+1

@Anonymous [ "감사합니다"라고하는 stackoverflow에서 선호하는 방법] (http://meta.stackexchange.com/a/5235/202811) –

1

동적으로 할당 된 개체를 다시 할당 할 수 있습니다. 문자열 리터럴은 정적 저장 기간을 가지며 변경할 수 없습니다. 문자열 리터럴을 수정하려고하면 정의되지 않은 동작이 발생합니다.

당신이 할 수있는 것은 다음과 같은

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

char *func(const char * str) 
{ 
    size_t len = strlen(str) + 3; 

    char *tmp = realloc(NULL, len); 

    if (tmp) strcpy(tmp, str); 

    return tmp; 
} 

int main(void) 
{ 
    char *str = func("hello"); 

    if (str) printf("str: %s\n", str); 

    free(str); 
} 

프로그램 출력은

str: hello 

이 전화

realloc(NULL, len) 

malloc(len) 
012에 해당하는 것을 고려하다
+0

'realloc (NULL, len);'단지'malloc (len)'이 아닌가? 그것들은 동등하지만, 후자는 더 의미 론적으로 보입니다. –

+0

@underscore_d realloc에 ​​대한 질문이 있으니. –

6

"hello"읽기 전용 문자열 문자입니다. 그 타입은 컴파일러가 char*에 할당을 허용하지만 실제로는 const char*입니다.

해당 포인터에서 realloc을 호출 할 때의 동작은 이며 정의되지 않음은입니다. 그래서 컴파일러는 좋아하는 것을 할 수 있습니다. 네 고양이를 먹을 수도있어.

관련 문제