2016-01-29 22 views
0

我有一個簡單的指向數組的指針,我想扭轉這種陣列,這是我寫的代碼:反向指針數組

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++; 
    } 
} 

正如你可以看到我用這個功用:

int str_len(char *p) { 
    int l = 0; 
    while (*(p + l) != '\0') { 
//  printf("%c %i", *(p + l),l); 
     l++; 
    } 
    return l; 
} 

我爲了得到我數組的長度,這是我的小主

int main() { 
    char *s = "Hallo world!"; 

    str_reverse(s); 

    return 0; 
} 

這是輸出:

length 10 
H [0] | d [10] 
Bus error: 10 

現在我試着只打印值,所以在str_reverse的while循環我評論這兩條線:

*(s + l) = *(s + r); 
*(s + r) = temp; 

這是輸出:

H [0] | ! [11] 

a [1] | d [10] 

l [2] | l [9] 

l [3] | r [8] 

o [4] | o [7] 

    [5] | w [6] 

那很好!但是,我如何儲存它們?預先感謝您

+0

出現這種情況,當你調用指針= >>陣列。指針不是一個數組而不是一個指針。 – Michi

+1

指針指向「某物」,但一個數組不指定。陣列內有「某物」。將被複制。這就是所有......所以如果你想在指針內複製「某些東西」,那麼你需要分配一些內存來使用指向那裏的指針。 – Michi

回答

2

問題是在mains指向一個字符串文字。這些文字通常存儲在只讀存儲器中,因此不能修改。

s更改爲數組用字符串文字初始化,它將工作。

char s[] = "Hallo world!"; 

使用動態分配的內存也將工作:

#include <stdlib.h> 
#include <string.h> 

... 

char *s = strdup("Hallo world!"); 
str_reverse(s); 
free(s); 
+0

你是說我不能用指針來做? – Francesco

+0

@Francesco你可以用一個指針來完成它,但它不能像'char * s ='Hallo world!''那樣指向只讀內存。如果它指向一個數組或動態分配內存,那很好。 – dbush

+0

是啊,它的工作原理,但我現在必須警告:) – Francesco