Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 反转指向数组的指针_C_Arrays_Pointers - Fatal编程技术网

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=>>数组时就会发生这种情况。指针不是数组,数组也不是指针。指针指向“某物”,但数组不是。在数组内部是“某物”。将被复制。这就是全部…所以如果你想复制指针中的“某物”,那么你需要分配一些内存,并使用指针指向那里。