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];