r***e 发帖数: 2000 | 1 为什么数组传不出来?谢谢!
1 #include
2 #include
3 #include
4
5 void pastr(char * comm)
6 {
7 comm = (char *)malloc(3);
8 strcpy(comm, "hw");
9 }
10
11 int main() {
12
13 char *comm;
14
15 pastr(comm);
16 printf("..comm..%s\n", comm);
17
18 return 0;
19 } |
M7 发帖数: 219 | 2 pastr里面的comm是你main里面comm的一个copy而已。pastr函数return之后, 函数里的
那个comm就消失了。main里的comm则完全没有被赋值。
你可以在partr里面把comm return出来。或者把pastr改成void pastr(char** comm)
【在 r***e 的大作中提到】 : 为什么数组传不出来?谢谢! : 1 #include : 2 #include : 3 #include : 4 : 5 void pastr(char * comm) : 6 { : 7 comm = (char *)malloc(3); : 8 strcpy(comm, "hw"); : 9 }
|
r***e 发帖数: 2000 | 3
谢谢
为什么二维数组就可以正确传出,而一维就不行?
数组难道不是传的地址吗?
【在 M7 的大作中提到】 : pastr里面的comm是你main里面comm的一个copy而已。pastr函数return之后, 函数里的 : 那个comm就消失了。main里的comm则完全没有被赋值。 : 你可以在partr里面把comm return出来。或者把pastr改成void pastr(char** comm)
|
M7 发帖数: 219 | 4 什么叫二维数组可以传出来?给了例子?
用参数来传数据,如果你要传的东西的类型是T, 那么参数的类型就必须是T*.
你再钻研一下指针的概念吧。
【在 r***e 的大作中提到】 : : 谢谢 : 为什么二维数组就可以正确传出,而一维就不行? : 数组难道不是传的地址吗?
|
r***e 发帖数: 2000 | 5
请看这段程序(运行结果在下面)。为什么hello没出来但是world可以出来?
#include
#include
#include
void pastr(char * comm, char ** para)
{
comm = (char *)malloc(9);
para[0] = (char *)malloc(9);
strcpy(comm, "hello");
strcpy(para[0], "world");
}
int main() {
char *comm, *para[]={NULL};
pastr(comm, para);
printf("..comm..%s.. para[0].. %s\n", comm, para[0]);
return 0;
}
$ ./a.out
..comm..(null).. para[0].. world
【在 M7 的大作中提到】 : 什么叫二维数组可以传出来?给了例子? : 用参数来传数据,如果你要传的东西的类型是T, 那么参数的类型就必须是T*. : 你再钻研一下指针的概念吧。
|
M7 发帖数: 219 | 6 para[0]和*para是一回事。
你的程序正说明了我前面说的东西。
【在 r***e 的大作中提到】 : : 请看这段程序(运行结果在下面)。为什么hello没出来但是world可以出来? : #include : #include : #include : void pastr(char * comm, char ** para) : { : comm = (char *)malloc(9); : para[0] = (char *)malloc(9); : strcpy(comm, "hello");
|
O*******d 发帖数: 20343 | 7 如果你需要把“hw“传出来,一般是在函数外把malloc做了,在函数里赋值。
【在 r***e 的大作中提到】 : 为什么数组传不出来?谢谢! : 1 #include : 2 #include : 3 #include : 4 : 5 void pastr(char * comm) : 6 { : 7 comm = (char *)malloc(3); : 8 strcpy(comm, "hw"); : 9 }
|
b***n 发帖数: 590 | 8
另一个参数,para 难道不是个memory violation吗?
为什么可以直接用 para[0]?
谢谢!
【在 O*******d 的大作中提到】 : 如果你需要把“hw“传出来,一般是在函数外把malloc做了,在函数里赋值。
|
a******p 发帖数: 157 | 9 *para[]={NULL}; 就是在初始化这个指针数组,这个数组只有一个元素,初始化指是
null
就像普通的 int a[]={1,2,3}类似 |
H***a 发帖数: 735 | 10 lz这个问题让我想起以前自己在C++里写得与此类似的错误code, 大体如下:
class A;
void func( A *a )
{
a = new A;
}
int main()
{
A *a = NULL;
func( a );
//print a - error!
}
错误正如M7说的那样. 改成return A* 或者 pass in A** 都可以 (注意A** 是表示你
要修改 A*所以传入 A*的pointer, i.e. A**, 而不是"二维数组").
但更严重的问题是memory leak (malloc 没有 free, new 没有 delete)!! 但是在哪里
free/delete呢? 显然不应该在 func里,不然不是白干活了? 在main里面? 作为func的
用户鬼才知道需要free/delete呢, 就算要清楚,也要知道内存大小吧, 这些都被封装在
func里了.
所以,从software engineering的角度,这种做法是应该避免的. 如OverCloud所言,在
func外面malloc再传进func. 各个模块职责清楚,谁alloc memory谁就负责清掉. |