-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

何がうまくいかないのですか?

4

5 に答える 5

3

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

エラーは、rev()で使用する前にのプロトタイプを生成しなかったためですmain()。関数をメインの上に移動するか、プロトタイプを追加してください。

c28: warning: function returns address of local variable

あなたの警告は、ローカル変数のアドレスを返そうとしているためです。それはできません。関数を終了すると、ローカル変数はスコープ外になるため、何か他のことを行う必要があります ( malloc()/free()呼び出しを追加して動的配列を使用するなど) 。

于 2013-03-05T15:58:26.017 に答える
0

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

}
于 2013-03-05T15:59:00.197 に答える
0

char reverse[strlen(s)];スタックにあります。関数が完了すると無効になりますが、そのアドレスを返しています。

于 2013-03-05T15:57:13.610 に答える
0

自動保存期間を持つ変数は、呼び出し元の関数にはもう存在しません。それにアクセスすると、未定義の動作が発生します (何が起こる可能性があります)。ここでは、ローカル変数であるreverseから戻っています。rev

代わりに、メモリを動的に割り当てます。

int *reverse = malloc(strlen(s)); /* + 1 for '\0' character ? */
于 2013-03-05T15:57:18.520 に答える
0

このコードでは:

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

reverse実行がこの関数のスコープを離れると割り当てが解除される、自動ストレージ期間を持つ一時配列です。ダングリング ポインターになるポインターを返します。
このポインタが指すメモリにアクセスしようとすると、未定義の動作が発生します。

を使用して動的に割り当てる必要があるという事実とは別に、は文字列の長さmallocを返すことに注意してください。strlen終了文字 ( ) 用のスペースも必要になります'\0'reverse次のように作成する必要があります。

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

'\0'の最後の文字に割り当てることを忘れないでくださいreverse。また、この関数の呼び出し元は、によって割り当てられたメモリの割り当てを解除する責任があることを忘れないでくださいmalloc。つまり、呼び出し元はfree、返されたポインターで呼び出す必要があります。

于 2013-03-05T16:02:16.660 に答える