2013-03-05 2 views
-4
이 오류 메시지입니다
#include<stdio.h> 
#include<string.h> 
#define MAX 30 

void push(char); 


char stack[MAX]; 
int tos=0; 

int main(){ 
    char str[]="Arijit Saha"; 
    char *final; 
    final=(char *)rev(str); 
    printf("%s",final); 
    rev(str); 
    getch(); 
    return 1; 
} 

char* rev(char s[]){ 
    int i; 
    for(i=0;i<strlen(s);i++) 
     push(s[i]); 
    char reverse[strlen(s)]; 

    for(i=0;i<strlen(s);i++) 
     reverse[i]=pop(); 

    return reverse; 

} 

void push(char c){ 
    stack[tos]=c; 
    tos++; 
} 
int pop(){ 
    tos--; 
    return stack[tos+1]; 

} 

.. 무엇이 잘못배열 반환 형식

Compiler: Default compiler 
    Executing gcc.exe... 
    gcc.exe "C:\TC\BIN\stringrevusingstack.c" -o "C:\TC\BIN\stringrevusingstack.exe" -g3 -I"C:\TC\INCLUDE" -I"C:\Dev-Cpp\include" -I"C:\Program Files\ImageMagick-6.7.4-Q16\include" -L"C:\Dev-Cpp\lib" -L"C:\TC\LIB" -L"C:\Program Files\ImageMagick-6.7.4-Q16\lib" -g3 
    C:\TC\BIN\stringrevusingstack.c:20: error: conflicting types for 'rev' 
    C:\TC\BIN\stringrevusingstack.c:14: error: previous implicit declaration of 'rev' was here 

    C:\TC\BIN\stringrevusingstack.c: In function `rev': 
    C:\TC\BIN\stringrevusingstack.c:28: warning: function returns address of local variable 

    Execution terminated 

를 일이야?

+1

로컬 변수의 주소가 반환됩니다. 그게 잘못된 것입니다. http://c-faq.com/~scs/cclass/int/sx5.html – netcoder

+2

훌륭한 컴파일러 경고입니다. 그것을 존중하십시오! –

+0

LIFO 만 사용하여 문자열을 역순으로 요청 했습니까? 그렇지 않으면 이것은 과잉입니다 ... – UmNyobe

답변

0

char reverse[strlen(s)];이 스택에 있습니다. 함수가 완료된 후에는 현재 유효하지 않지만 주소를 반환하고 있습니다.

0

자동 저장 저장 기간이 더 이상없는 변수가 호출 기능에 더 이상 존재하지 않습니다. 액세스하면 정의되지 않은 동작이 발생합니다 (아무 일도 발생할 수 있음). 여기에서 로컬 변수 인 rev에서 reverse을 반환합니다.

오히려 동적으로 메모리를 할당 : 당신이 당신의 main()에 그것을 사용하기 전에 rev()에 대한 프로토 타입을 생성하지 않았기 때문에

int *reverse = malloc(strlen(s)); /* + 1 for '\0' character ? */ 
3

c:14: error: previous implicit declaration of 'rev' was here

귀하의 오류입니다. 함수를 메인 위에 놓거나 프로토 타입을 추가하십시오.

c28: warning: function returns address of local variable

귀하의 경고는 로컬 변수의 주소를 반환하려고하기 때문에, 당신은 그렇게 할 수 있습니다. 함수를 떠날 때 지역 변수가 범위를 벗어 났으므로 다른 것을해야합니다 (예 : malloc()/free() 호출을 통해 동적 배열 사용)

0

역 배열은 로컬 배열입니다. 함수가 종료되면 파기되지만 내용에 대한 포인터를 반환합니다.

char* rev(char s[]) { 
    char reverse[strlen(s)]; 
    ... 
    return reverse; 
} 

reverse가 있습니다 : 이상적으로, 당신은 함수로 데이터를로드하는 매개 변수, 즉이 코드에서

void MyFuncReturnsArray(int* myArr, int n) 
{ 
    for(int i = 0; i < n; ++i) 
     myArr[i] = i; 
} 

대신

int* MyFuncReturnsArray() 
{ 
    int myArr[10]; 
    for(int i = 0; i < 10; ++i) 
     myArr[i] = i; 
    return myArr 

} 
0

를함으로써 배열을 반환해야 실행이이 함수의 범위를 벗어나면 자동 저장 기간이 할당 취소되는 임시 배열입니다. 포인터 이 매달려진 포인터을 반환합니다.
이 포인터가 가리키는 메모리에 액세스하려고 시도하면 정의되지 않은 동작가 생성됩니다.

외에 당신이 malloc를 사용하여 동적으로 할당해야한다는 사실에서, strlen 문자열의 길이를 반환합니다, 당신은 또한 종료 문자 ('\0')의 공간이 필요합니다.

char* reverse = malloc(strlen(s) + 1); 

reverse의 마지막 문자에 '\0'를 할당하는 것을 잊지 마세요 :이 같은 reverse을 만들어야합니다. 또한이 함수의 호출자가 malloc에 의해 할당 된 메모리의 할당을 해제해야한다는 점을 잊지 마십시오. 호출자는 반환 된 포인터에 free을 호출해야합니다.