C:char*的问题

Pie*_*ter 2 c pointers

/*
 * code.c
 *
 * TASK
 *      Reverse a string by reversing pointers. Function should use return
 *      type char* and use a char* parameter as input.
 */
#include <stdio.h>
#include <string.h>
#define STRMAX 51

char* reverse(char* sPhrase[]);

int main() {
    char sPhrase[STRMAX];
    char sReverse[STRMAX];
    printf("Enter string (max. 50 chars): ");
    gets(sPhrase);
    sReverse = reverse(sPhrase);

    return 0;
}

char* reverse(char* sPhrase[]) {
    char* sOutput[STRMAX];
    int iCnt = 0, iCntRev;

    for (iCntRev = strlen(*sPhrase)-2; iCntRev >= 0; iCntRev--) {
        sOutput[iCnt] = sPhrase[iCntRev];
        iCnt++;
    }

    *sOutput[iCnt] = '\0';      // Don't forget to close the string

    return sOutput;
}
Run Code Online (Sandbox Code Playgroud)

这段代码有一些怪癖:

  • sReverse = reverse(sPhrase);

    • [错误]分配中的不兼容类型
    • [警告]从不兼容的指针类型传递"反向"的arg 1
  • return sOutput;

    • [Warning]函数返回局部变量的地址
    • [警告]从不兼容的指针类型返回

这些警告意味着什么?我该如何修补错误?该函数应该将char*作为返回类型和参数保留,因为我将这个小程序作为C培训课程的一部分.

Blu*_*eft 6

我看到一些问题.首先,char* sOutput[STRMAX]是一系列char*的 - 可能是你的意思char sOutput[STRMAX]

其次,更重要的是,当你以某种方式在函数中声明一个数组(char sOutput[STRMAX])时,它会在堆栈上分配并在函数返回时释放.因此,如果你试图返回它,你会得到未定义的结果,因为它在技术上不再存在!

解决方案是将缓冲区传递给函数以供其使用:

char* reverse(char const sPhrase[], char sOutput[])
Run Code Online (Sandbox Code Playgroud)

(我添加了const所以你不小心覆盖了sPhrase).然后reverse像这样打电话:

reverse(sPhrase, sReverse);
Run Code Online (Sandbox Code Playgroud)

至于你的算法是否有效......