内容目录
咱也不是主修 C/C++ 的,但最近看到一个题,代码如下:
#include "stdio.h"
#include "string.h"
void fun(char *w, int n);
int main() {
char *s = "1234567";
fun(s, strlen(s));
puts(s);
return 0;
}
void fun(char *w, int n) {
char t, *s1, *s2;
s1 = w;
s2 = w + n - 1;
while (s1 < s2) {
t = *s1++;
*s1 = *s2--;
*s2 = t;
}
}
如果仔细分析代码,一步一步慢慢执行,也能得出答案是 "1711717"。但我实际跑起来的时候,在 *s1 = *s2--;
处崩溃了。
经过网上冲浪得到答案,使用 char *s = "1234567";
这种方式声明的字符串属于常量,是不可修改的,而上文提到的那一行就是在修改这个常量,所以程序崩掉了。
正确写法应该如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void fun(char *w, int n);
int main() {
char *s = (char *)malloc(8 * sizeof(char));
strcpy(s, "1234567");
fun(s, strlen(s));
puts(s);
return 0;
}
void fun(char *w, int n) {
char t, *s1, *s2;
s1 = w;
s2 = w + n - 1;
while (s1 < s2) {
t = *s1++;
*s1 = *s2--;
*s2 = t;
}
}
就是说应该开辟一块内存,然后把常量复制进去,这样就能得到一个能修改的字符串了。
虽然咱不常写 C,过了这段时间久了不用肯定就忘了,但记下来总归是好的。