[英]C program unexpectedly crashes after giving correct output
我正在尝试编写一个简单的C程序来反转字符串。 代码如下:
void swap(char* a, char* b){
char* temp;
*temp = *a;
*a = *b;
*b = *temp;
}
char* reverseString(char* str){
int length = strlen(str);
int i=0;
for(i=0; i<(length/2); i++){
swap(&str[i], &str[length-i-1]);
}
return str;
}
int main(){
char str[] = "Hello World";
reverseString(str);
printf("%s\n",str);
return 0;
}
它确实打印正确的结果,但随后发出了SEGMENTATION FAULT。 它发生在主函数的“ return 0”语句上。
您能帮我弄清楚为什么发生SEG故障。
谢谢。
在您的swap()
函数中,问自己:
void swap(char* a, char* b){
char* temp;
问: temp
现在指向哪里?
答:未知,可能在某个地方很危险。
*temp = *a;
但是我们只是在那个地方写了一些东西。
而是使用char
:
void swap(char* a, char* b){
char temp;
temp = *a;
*a = *b;
*b = temp;
}
您调用未定义的行为,这就是代码似乎可以正常运行的原因,但是它实际上并没有正常工作,这是您遇到的问题
void swap(char* a, char* b) {
char *temp;
*temp = *a;
*a = *b;
*b = *temp;
}
您将temp
声明为char
指针,然后在它是无效指针时取消引用它,正确的方法是
void swap(char* a, char* b) {
char temp;
temp = *a;
*a = *b;
*b = temp;
}
你也可以做到
void swap(char* a, char* b) {
char temp[1];
*temp = *a;
*a = *b;
*b = *temp;
}
这没有多大意义,但是可以工作,或者您甚至可以这样做
void swap(char* a, char* b) {
char *temp;
temp = malloc(1);
if (temp != NULL)
{
*temp = *a;
*a = *b;
*b = *temp;
free(temp);
}
}
这没有什么意义,但也可以使用,要点是向您显示使用间接运算符*
,指针必须有效。
因此,程序崩溃的原因是无效的指针取消引用导致的未定义行为。
在交换函数中,要么使用int temp,要么使用int temp。
void swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
或将int * temp = NULL设置为不指向未知内存。
void swap(char *a, char *b)
{
char *temp = NULL;
*temp = *a;
*a = *b;
*b = *temp;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.