我试图编写一个反转字符串的简单函数:
#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));
}
当我因某种原因调用此函数时,我收到Segmentation fault Core Dumped错误。 我无法发现它造成的地方。 任何人?
答案 0 :(得分:4)
您的问题在于您首先如何创建字符串:
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";
答案 1 :(得分:3)
您没有在尝试放置字符常量的位置分配内存,&#39;&#39; b&#39;以及&#39; \ 0&#39;。
写
char str[] = "ab";
或
char *str = malloc( 3 * sizeof( char ) );
str[0]='a';
*(str+1)='b';
*(str+2)='\0';
//...
free( str );
此声明
printf("%s %d %s" ,str,strlen(str),reverseStr(str));
具有未定义的行为,因为未指定函数参数的评估顺序。将其改写为
printf("%s %zu " ,str,strlen(str));
printf("%s" , reverseStr(str));
考虑到函数strlen
的返回类型为size_t
答案 2 :(得分:1)
将内存分配给str将解决您的问题。
喜欢
char str[3];
但我在你的程序中又看到了一个问题。
如果编译并运行程序,则可能无法打印初始字符串“ab”。因为输出取决于执行顺序,因为您将字符串设置为函数并且该函数正在修改字符串你最终可能会打印两次反向字符串。 因此,最好在调用函数reverseStr()
之前打印初始字符串