2011-09-23 44 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