2011-09-23 48 views
1

我想分配內存並將其填充到指針,它是函數參數之一,但我認爲我沒有得到一些重要的東西,請幫助我。分配並初始化本地函數中的指針

所以,如果我這樣做,一切工作正常:

void alloc(char **p, int n) 
{ 
*p = new char[n]; 
} 

int main() { 
char * ptr = NULL; 
int n = 10; 
alloc(&ptr, n); 
for(int i = 0; i<(n - 1); i++) 
    ptr[i] = '1'; 
ptr[n - 1] = '\0'; 

printf("%s", ptr); 
return 0; 
} 

現在我也想初始化分配的內存入函數

void alloc(char **p, int n) 
{ 
*p = new char[n]; 
for(int i = 0; i<(n - 1); i++) 
    *p[i] = '1'; 
*p[n - 1] = '\0'; 
} 

int main() { 
char * ptr = NULL; 
int n = 10; 
alloc(&ptr, n); 
printf("%s", ptr); 
return 0; 
} 

程序崩潰。我不明白爲什麼。請有人解釋一下嗎?

+1

我不確定'*'和'[]'的優先級。嘗試聲明一個本地'char *'也許? – Seb

+0

這是過度的記憶,下面每個人都給出正確的建議。 – Alecs

回答

4

嘗試用(*p)[i](*p)[n - 1]代替。優先規則導致*p[i]被評估爲*(p[i])

+0

它的工作原理,謝謝!而這種分配內存的方式是正確的?我被告知這是不正確的,因爲指針不指向任何東西.. – Alecs

+0

@收音機:它是正確的。 'ptr'確實沒有指向任何東西,但是你傳遞給'alloc'的是一個指向'ptr'的指針。所以'* p'指的是'ptr'本身,而不是'ptr'指向的任何東西。並且由於'* p = new char [n];'使'ptr'指向某些有效的東西,現在可以安全地使用'* p'和'ptr'作爲數組。 –

3

試試這個:

((*p)[i]) = '1'; 

你與運營商的評估順序的問題。

+0

它的工作原理,謝謝!而這種分配內存的方式是正確的?我被告知這是不正確的,因爲指針不指向任何東西。 – Alecs

2

大概是因爲這樣的:

*p[i] 

,如果你寫的解釋是:

*(p[i]) 

不是像你這樣寫,這是你可能是指:

(*p)[i] 
+0

它的工作原理,謝謝!而這種分配內存的方式是正確的?我被告知這是不正確的,因爲指針不指向任何東西。 – Alecs

1

試試這個

#include <stdio.h> // for NULL 

void alloc(char **p, int n) 
{ 
    *p = new char[n]; 
    for(int i = 0; i<(n - 1); i++) 
     *((*p) + i) = '1'; 
    *((*p) + n - 1) = '\0'; 
} 

int main() { 
    char * ptr = NULL; 
    int n = 10; 
    alloc(&ptr, n); 
    printf("%s", ptr); 

    // never forget delete pointers 
    delete [] ptr; 
    return 0; 

} 
+0

它的工作原理,謝謝!而這種分配內存的方式是正確的?我被告知這是不正確的,因爲指針不指向任何東西。 – Alecs

1

它是運營商問題的優先級。在你的頁頭功能試試這個:

for(int i = 0; i<(n - 1); i++) 
    (*p)[i] = '1'; 
(*p)[n - 1] = '\0'; 
+0

它的工作原理,謝謝!而這種分配內存的方式是正確的?我被告知這是不正確的,因爲指針不指向任何東西。 – Alecs

+0

@elecs:是的,分配是正確的 – sashang

2

這應該做的伎倆,

void 
alloc(char*& p, int n) 
{ 
    p = new char[n]; 
    std::fill_n(p, n - 1, '1'); 
    p[n - 1] = '\0'; 
} 

如果你堅持使用指針作爲參數,在功能改變所有p(*p) (並且不要忘記檢查一個空指針 並且做一些合理的事情,如果你通過了一個。

所有事情都被考慮,但是,喲你最好使用 std::string —這個功能甚至不是必須的,因爲你的 可以寫std::string(n, '1')

+0

是的,我也喜歡C++多於C,但現在我必須使用C – Alecs

+0

@Alecs:'new'是C++。 –

+0

哦,是的,我知道,在這個簡單的例子中,如何分配並不重要,問題在其他方面,當我寫它時,我會自動用新的:-)寫入它 – Alecs