C 反向字符串函数的分段错误

C 反向字符串函数的分段错误,c,C,我正在尝试编写一个简单的函数来反转字符串: #include <stdio.h> #include <string.h> #include <stdlib.h> char* reverseStr(char*s) { int sLen=strlen(s); int i; char temp; for (i=0;i<(sLen/2);i++) { //swap temp=s[i]

我正在尝试编写一个简单的函数来反转字符串:

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

char* reverseStr(char*s)
{
    int sLen=strlen(s);
    int i;
    char temp;

    for (i=0;i<(sLen/2);i++)
    {
         //swap
         temp=s[i];
         s[i]=s[sLen-i-1];
         s[sLen-i-1]=temp;
    }
    return s;
}
main()
{
    int num=64;
    char*str;
    str[0]='a';
    *(str+1)='b';
    *(str+2)='\0';
    printf("%s %d %s" ,str,strlen(str),reverseStr(str));
}
#包括
#包括
#包括
char*reverseStr(char*s)
{
int sLen=strlen(s);
int i;
焦炭温度;

对于(i=0;i您的问题首先在于如何创建字符串:

char*str;
str[0]='a';
*(str+1)='b';
*(str+2)='\0';
str
的声明为它提供了一个任意值,因此用
str[0]
解除对它的引用是未定义的行为

您可以通过以下方式进行修复:

char str[3];
str[0]='a';
*(str+1)='b';
*(str+2)='\0';
虽然我不知道为什么要混合使用解引用方法(
base[idx]
*(base+idx)

或者,您可以尝试以下更简洁的选项:

char str[3]; strcpy (str, "ab");
char str[] = "ab";

您没有在试图放置字符常量“a”、“b”和“\0”的位置分配内存

要么写

char str[] = "ab";

还有这个声明

printf("%s %d %s" ,str,strlen(str),reverseStr(str));
具有未定义的行为,因为函数参数的求值顺序未指定。请将其重写为

printf("%s %zu " ,str,strlen(str));
printf("%s" , reverseStr(str));

考虑到函数strlen具有返回类型
size\t

为str分配内存将解决您的问题

但我在你的程序中发现了一个问题

如果编译并运行程序,您可能无法打印初始字符串“ab”。因为输出取决于执行顺序,因为您将字符串传递给一个函数,而该函数正在修改字符串,您可能会打印两次反向字符串。
因此,最好在调用函数reverseStr()之前打印初始字符串,然后使用所有警告和调试信息(
gcc-Wall-Wextra-g
)编译。然后使用调试器(
gdb
)显示此函数的调用者
str[0]='a'
,此处
str
未分配内存。
char*str;
未分配内存。更改为
char-str[3];
-Wall:
警告:
此函数中未初始化使用了“str”
char-str[]=“ab”
这将是我觉得最惯用的方式,因为你是对的。我一直在搞乱内存分配。谢谢。你说得对,我在没有运行时错误时也发现了这个问题。谢谢!
printf("%s %zu " ,str,strlen(str));
printf("%s" , reverseStr(str));
char str[3];