c - 使用递归反转字符串 - 出现 'Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)' 错误

标签 c function recursion reverse c-strings

我尝试使用以下代码反转字符串,但收到错误线程 1:EXC_BAD_ACCESS (code=1,address=0x0)

我知道它告诉我我正在尝试访问 NULL 指针,但我看不到在哪里:

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

int empty(char s[]){
    return strcmp(s, "") == 0 ? 1 : 0;
}

char getHead(char s[]){
    char *dup = (char *)malloc(sizeof(char));
    strcpy(dup, (s + 0));
    return *dup;
}

char * getTail(char s[]){
    char *dup = malloc(sizeof(char) * strlen(s) - 1);
    for(int i = 0; i < strlen(s) - 1; i++){
        dup[i] = s[i+1];
    }
    return dup;
} 

char * ReverseStringHeadTail(char s[]){
    if(empty(s))
    {
        return NULL;
    }
    else
    {
        char head = getHead(s);
        char *tail = getTail(s);
        return strcat(ReverseStringHeadTail(tail), head); // Error: Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
    }
}

int main(int argc, const char * argv[]) {
    char string[] = "string";
    printf("%s\n", ReverseStringHeadTail(string));

    return 0;
}

谢谢!

最佳答案

函数empty可以写得更简单。

int empty( const char *s )
{
    return *s == '\0';
}

函数getHead无效且没有意义。 它为一个字符分配内存,但试图复制整个字符串。它的调用会导致内存泄漏。

你可以直接写

char getHead( const char *s )
{
    return *s;
}

函数getTail也无效。例如,如果字符串是 "A",则该函数会分配 0 字节的内存。在任何情况下,分配的内存都不会包含字符串。

函数 strcat 不能与 char 类型的对象或空指针一起使用。

您的意思似乎如下。

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

char * ReverseStringHeadTail( const  char *s )
{
    if ( *s == '\0' ) return calloc( 1, 1 );

    char tmp[2] = { *s, '\0' };

    char *p = ReverseStringHeadTail( s + 1 );
    p = realloc( p, strlen( p ) + sizeof( tmp ) );

    return strcat( p, tmp );
}

int main(void) 
{
    const char *s = "12345";

    puts( s );

    char *p = ReverseStringHeadTail( s );

    puts( p );

    free( p );

    return 0;
}

程序输出如下

12345
54321

注意该函数并不检查内存是否分配成功。

关于c - 使用递归反转字符串 - 出现 'Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927444/

相关文章:

c - (unix/C) "stty: stdin isn' t a terminal"when using system() function

c - 从 C 程序中写入 ip 地址的最简单方法是什么?

指向函数的 C++ 指针导致段错误

javascript - 有人可以解释 return 语句如何与 javascript 中的递归一起使用吗?

java - JPA递归延迟加载失败

c++ - bst 插入递归 C++

c - C链表中的优先级队列

c - 为函数分配参数

mysql - MySQL 的减值函数

c - 在linux中用C创建目录