即,为什么以下工作:
char* char_array(size_t size){
return new char[size];
}
int main(){
const char* foo = "foo";
size_t len = strlen(foo);
char* bar=char_array(len);
memset(bar, 0, len+1);
}
但是以下段错误:
void char_array(char* out, size_t size){
out= new char[size];
}
int main(){
const char* foo = "foo";
size_t len = strlen(foo);
char* bar;
char_array(bar, len);
memset(bar, 0, len+1);
}
答案 0 :(得分:2)
将'bar'传递给char_array是在调用时传递指针的当前值的副本 - 所以char_array中的'out'指向与'bar'相同的东西但是它们是完全孤立的变量,当char_array返回时,新分配的值就会丢失。
如果要实际修改'bar'变量,则需要将指针或引用传递给bar变量本身,即
void char_array(char** out, size_t size) {
*out = new char[size];
}
...
char_array(&bar, len);
或
void char_array(char*& out, size_t size) {
out = new char[size];
}
...
char_array(bar, len);
...
答案 1 :(得分:1)
您没有修改out
,您需要通过引用传递指针:
void char_array(char*& out, size_t size)
// |
// pass by reference
现在你正在使用未初始化的指针调用memset
。
答案 2 :(得分:1)
0 void char_array(char* out, size_t size)
1 {
2 out = new char[size];
3 }
5 int main()
6 {
7 const char* foo = "foo";
8 size_t len = strlen(foo);
9 char* bar;
10 char_array(bar, len);
11 memset(bar, 0, len+1);
12 }
第9行的 char* bar
未初始化,因此声明一个可指向任何位置的指针变量。第10行调用char_array,将该垃圾指针值复制到out
参数。请注意,它是来自bar内的垃圾值的复制 - out
获取值但与bar
没有固有的连接。永远不会使用这个垃圾值 - 它只是被第2行new
返回的指针覆盖,然后在函数返回时被丢弃。
要允许char_array
更改bar
本身,请使用对指针的引用:
void char_array(char*& out, size_t size) { out = new ... }
...或指向指针的指针......
void char_array(char** p_out, size_t size) { *p_out = new ... }
char_array(&bar, len);
无论哪种方式char_array
都知道bar
修改它的位置。