我尝试使用以下代码反转字符串,但收到错误线程 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/