在本地函数中分配和初始化指针

时间:2011-09-23 10:03:36

标签: c++ pointers char

我想分配内存并将其填充到指针,这是函数参数之一,但我认为我没有得到一些重要的东西,请帮助我。

所以,如果我这样做,一切正常:

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

程序崩溃。我不明白为什么。请有人解释一下吗?

6 个答案:

答案 0 :(得分:4)

请尝试使用(*p)[i](*p)[n - 1]。优先规则会导致*p[i]被评估为*(p[i])

答案 1 :(得分:3)

试试这个:

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

您对运营商的评估订单有疑问。

答案 2 :(得分:2)

可能是因为:

*p[i]

被解释为好像你写了这个:

*(p[i])

不像你写过这个,这就是你的意思:

(*p)[i]

答案 3 :(得分: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' )

答案 4 :(得分: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;

}

答案 5 :(得分:1)

它是运营商问题的优先选择。在你的alloc函数中尝试这个:

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