我刚刚写了一个非常简单的字符串反转函数,遇到了一个我无法理解的问题:
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--;
}
}
无法理解原因;你能解释一下吗?
最佳答案
当您使用 char *temp;
和:
*temp = *end;
你正在取消引用一个未初始化的指针并写入一个未定义的位置,调用未定义的行为和(幸运的是你)崩溃。无法保证崩溃。当您使用 char temp;
时,您已经让编译器为 char
值分配了空间。对于指针,指针本身有 4 或 8 个字节的存储空间,但它需要指向一个字符位置——而您还没有将其设置为这样做。 (你也不应该;char *temp
版本基本上是一个错误。)
- 使用不会崩溃的版本。
- 当您使用指针时,请始终确保您知道它指向的是什么。
关于使用字符指针崩溃;使用普通字符不会崩溃——但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19805013/