我刚写了一个非常简单的字符串反转函数,遇到了一个我无法理解的问题:
void reverse(char *data) {
int length = 0,i;
char *temp,*start,*end;
start = data;
end = data;
length = strlen(data);
end = end + (length -1);
for(i=0; i< length/2; i++) {
*temp = *end;
*end = *start;
*start = *temp;
start++;
end--;
}
}
int main()
{
int length1 = 0;
char data1[100] = "I am megharaj from india";
printf("data1 %s\n", data1);
reverse(data1);
printf("reversed\n");
printf("data1 %s\n", data1);
return 0;
}
这会给出细分错误,但如果我将char *temp
更改为char temp
,那么一切正常,如下所示:
void reverse(char *data) {
int length = 0,i;
char temp,*start,*end;
start = data;
end = data;
length = strlen(data);
end = end + (length -1);
printf("length %d\n", length);
for(i=0; i< length/2; i++) {
temp = *end;
*end = *start;
*start = temp;
start++;
end--;
}
}
无法理解原因;你能解释一下吗?
答案 0 :(得分:2)
使用char *temp;
和:
*temp = *end;
您正在取消引用未初始化的指针并写入未定义的位置,调用未定义的行为并且(幸运的是)崩溃。崩溃不能得到保证。使用char temp;
时,您已使编译器为char
值分配空间。使用指针,您可以为指针本身提供4或8个字节的存储空间,但它需要指向一个字符位置 - 而您没有将其设置为这样做。 (你也不应该; char *temp
版本基本上是一个错误。)
答案 1 :(得分:2)
char *temp
未在任何地方初始化 - 您在此处取消引用垃圾值:
*temp = *end;
temp
具有存储类auto
,默认情况下不会初始化为任何内容。
请改用char
。像:
char temp;
此外,您需要1 char
小于字符串的长度,以便忽略NUL
字符:
end = end + (length-1 ); // I added this part because in your intial code
//(on posting question) this line was end = end + (length);
更正后的代码:
void reverse(char *data) {
int length = 0,i;
char temp,*start,*end;
start = data;
end = data;
length = strlen(data);
end = end + (length-1 );
for(i=0; i< length/2; i++) {
temp = *end;
*end = *start;
*start = temp;
start++;
end--;
}
}
以下是full program
答案 2 :(得分:1)
* start指向data1数组我在这里start = data;
* end指向data1数组我在这里end= data;
但*temp
没有指向任何地方。
内存未分配给char *temp
,而您试图在*end
中存储*temp
的值,因此会产生分段错误。
而是尝试使用
char temp;