在 C 中反转后无法打印字符串

Can't print string after reverse in C

我正在将此函数写入 return 反转字符串的字符指针。

void * PreverseStr (char str[]) 
{
    int size = strlen (str);
    char *returnstr = (char *)malloc (size * sizeof(char));
    for (int i = size - 1; i >= 0 ; i--)
    { 
        *returnstr = str[i];
        returnstr ++;
    }
    returnstr = 0;
    returnstr -= size;

    return returnstr ;
}

为了测试这个功能,我写了一个像这样的主函数

int main()
{   
    char str[] = "abcdefghijklmnopqrstuvwxyz";

    char *newstr = PreverseStr(str);
    printf("Reversed string using pointer: %s\n", newstr);

    free(newstr);

    return 0;
}

但是它在打印出任何东西之前就崩溃了。我想知道我的代码有什么问题。如果您能解释对此的修复,那将非常有帮助。

对于初学者来说,return 类型 void * 毫无意义。 return 类型应该是 char *。由于函数在不更改源字符串的情况下创建新字符串,因此函数参数应具有限定符 const.

这个内存分配

char *returnstr = (char *)malloc (size * sizeof(char));

分配的资源不足 space tp 存储源字符串的终止零字符 '[=20=]'

你至少需要写

char *returnstr = (char *)malloc ( ( size + 1 ) * sizeof(char));

在 for 循环之后指针 returnstr 指向超出分配的内存,因为它在循环内增加了

returnstr ++;

而且在这次作业之后

returnstr = 0;

变成空指针

函数可以通过以下方式声明和定义

char * reverse_copy( const char s[] ) 
{
    size_t n = strlen( s );

    char *p = malloc( n + 1 );

    if ( p != NULL )
    {
        p += n;
        *p = '[=14=]';

        while ( n-- )
        {
            *--p = *s++;
        }
    }

    return p;
}

这里有一个演示程序。

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

char *reverse_copy( const char s[] )
{
    size_t n = strlen( s );

    char *p = malloc( n + 1 );

    if (p != NULL)
    {
        p += n;
        *p = '[=15=]';

        while (n--)
        {
            *--p = *s++;
        }
    }

    return p;
}

int main( void )
{
    const char *s = "Hello, World!";

    puts( s );

    char *p = reverse_copy( s );

    if (p) puts( p );

    free( p );
}

它的输出是

Hello, World!
!dlroW ,olleH