C 反转指向数组的指针
我有一个指向数组的简单指针,我想反转该数组,这是我编写的代码:C 反转指向数组的指针,c,arrays,pointers,C,Arrays,Pointers,我有一个指向数组的简单指针,我想反转该数组,这是我编写的代码: void str_reverse(char *s) { int l, r; l = 0; r = str_len(s) - 1; char temp; printf("length %i ", r); while (l <= r) { temp = *(s + l); printf("\n%c [%i] | %c [%i]\n", temp, l,
void str_reverse(char *s) {
int l, r;
l = 0;
r = str_len(s) - 1;
char temp;
printf("length %i ", r);
while (l <= r) {
temp = *(s + l);
printf("\n%c [%i] | %c [%i]\n", temp, l, *(s + r), r);
*(s + l) = *(s + r);
*(s + r) = temp;
r--;
l++;
}
}
我为了得到我的数组的长度,这是我的小main
int main() {
char *s = "Hallo world!";
str_reverse(s);
return 0;
}
这是输出:
length 10
H [0] | d [10]
Bus error: 10
H [0] | ! [11]
a [1] | d [10]
l [2] | l [9]
l [3] | r [8]
o [4] | o [7]
[5] | w [6]
现在我尝试只打印值,因此在str_reverse的while循环中,我对这两行进行了注释:
*(s + l) = *(s + r);
*(s + r) = temp;
这是输出:
length 10
H [0] | d [10]
Bus error: 10
H [0] | ! [11]
a [1] | d [10]
l [2] | l [9]
l [3] | r [8]
o [4] | o [7]
[5] | w [6]
那太好了!但是我如何储存它们呢?提前谢谢问题是在
main
中,s
指向字符串文本。这些文本通常存储在只读内存中,因此无法修改
将s
更改为使用字符串文字初始化的数组,它将正常工作
char s[] = "Hallo world!";
使用动态分配的内存也可以:
#include <stdlib.h>
#include <string.h>
...
char *s = strdup("Hallo world!");
str_reverse(s);
free(s);
#包括
#包括
...
char*s=strdup(“你好,世界!”);
逆时针旋转(s);
免费的;
问题是在main
中,s
指向字符串文本。这些文本通常存储在只读内存中,因此无法修改
将s
更改为使用字符串文字初始化的数组,它将正常工作
char s[] = "Hallo world!";
使用动态分配的内存也可以:
#include <stdlib.h>
#include <string.h>
...
char *s = strdup("Hallo world!");
str_reverse(s);
free(s);
#包括
#包括
...
char*s=strdup(“你好,世界!”);
逆时针旋转(s);
免费的;
@Francesco你可以用指针来做,但它不能像char*s=“你好!”代码>。如果它指向数组或动态分配的内存,则没有问题。@Francesco这些警告是什么?string.c:56:15:警告:隐式声明库函数“strdup”,类型为“char*(const char*)”char*s=strdup(“Hallo world!”);^string.c:56:15:注意:包含标题或显式提供“strdup”字符串的声明。c:87:5:警告:函数“free”的隐式声明在C99[-Wimplicit function declaration]free中无效;^生成2个警告。@Francesco然后您需要包括string.h
和stdlib.h
。请参阅我的编辑。Strdup不是C标准库。@Francesco您可以用指针来完成它,但它不能指向只读内存,如char*s=“Hallo world!”代码>。如果它指向数组或动态分配的内存,则没有问题。@Francesco这些警告是什么?string.c:56:15:警告:隐式声明库函数“strdup”,类型为“char*(const char*)”char*s=strdup(“Hallo world!”);^string.c:56:15:注意:包含标题或显式提供“strdup”字符串的声明。c:87:5:警告:函数“free”的隐式声明在C99[-Wimplicit function declaration]free中无效;^生成2个警告。@Francesco然后您需要包括string.h
和stdlib.h
。请参阅我的编辑。Strdup不是C标准库。当调用指针=>>数组时会发生这种情况。指针不是数组,数组也不是指针。指针指向“某物”,但数组不是。在数组内部是“某物”。将被复制。这就是全部…所以如果你想复制指针中的“某物”,那么你需要分配一些内存来使用指针指向那里。当你调用Pointer=>>数组时就会发生这种情况。指针不是数组,数组也不是指针。指针指向“某物”,但数组不是。在数组内部是“某物”。将被复制。这就是全部…所以如果你想复制指针中的“某物”,那么你需要分配一些内存,并使用指针指向那里。