2014-10-01 65 views
0

我簡單地做一個字符數組str.later我犯了一個char *p它簡單地指向它,我可以訪問(行程)從開始到結束str,我可以操縱使用pstr,意味着 p[i]='x';(其中,i:一有效索引,x:任何字符)是否有效?實際上我試過它是工作,我的問題是沒有必要使用malloc給它記憶(即p = malloc(l * sizeof(char));)。可以使用char指針來操作它指向的char數組嗎?

#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char str[20]; 
    char *p; 
    scanf("%s",str); 
    printf("%s\n",str); 
    int l=(int)strlen(str); 
    // printf("l= %d\n",l); 
    //p=str; 
    //p=malloc(l*sizeof(char)); 
    p=str; 
    int i; 
    for(i=0;i<l;++i) 
    printf("%c-",*(p+i)); 
    printf("\nNow p=%s\n",p); 
    p[1]='x';  // it is valid , but difficult to understand?? we didnot give it memory,but it can manipulate the str as well. 
    printf("After changes made\n",p); 
    printf("p=%s\n",p); 
    printf("str=%s\n",str); 
    return 0; 
} 
+1

是的,這是好的。 'char str [20];'分配20個字節,你用'p'指向那個分配。 – 2014-10-01 11:38:52

+0

我認爲解釋沒問題*'* p'必須指向有效內存*。 – usr2564301 2014-10-01 11:38:55

+0

'p = str'表示'p'擁有'char'數組'str'的​​基地址。 – 2014-10-01 11:39:34

回答

1

在這種情況下,不需要爲p分配內存。當您執行以下操作時,內存被分配到堆棧strchar str[20];。在你做了p=str;之後,pstr都指向堆棧上的相同內存地址。只要str在範圍內,strp都可用於操縱它們共享的內存地址的值。因此,p[1]='x';str[1]='x';是等同的。

但要小心,如果您在左側範圍後保留p的值,並嘗試使用它,則會發生未定義的行爲。當str離開作用域時,內存將被釋放,p將指向棧上可能被別的東西使用的地址。使用p然後可能不會得到你想要的,並且對p進行更改可能會干擾不相關的值。

p=malloc(l*sizeof(char));在堆上分配新的內存。由於其在堆上負責釋放此內存,因此在處理退出分配的範圍時它仍將被分配。

你可以找到更多相關的內容在這裏:What is the difference between char s[] and char *s in C?

+0

1'str'離開範圍時,向哪個'p'點? – m23 2014-10-01 12:11:18

+0

現在p指向'NULL'? – m23 2014-10-01 12:18:37

+1

不,它繼續指向相同的內存位置,現在可能會被別的東西使用,或垃圾。 – Max 2014-10-01 12:54:56

0

因爲你只是替換指向的字節的內容,所以你不需要爲它分配新的內存。

+0

賦值後'p = str;'它表示我的意思是什麼,現在它們有相同的地址,但p現在是一個像str這樣的數組,它有自己的內存空間,或者它與str共享它? – m23 2014-10-01 11:44:35

相關問題