由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C pass string 问题
相关主题
帮忙看看这几段程序有问题吗?C++ STL map find does not work ???
问个c语言的问题New C++ programmer, need to ask a I/O file read question
随手写的C程序,请指教Array in C
请帮忙看看这个字符函数的错误在哪里weird output
请问strcpy()和memcpy()的写法问题  (转载)关于 exception 的一个问题
请教一道c/c++题问个char*的问题
c的问题请教一个C里面string copy的问题
strcat()What is wrong with the constructor calling?
相关话题的讨论汇总
话题: comm话题: para话题: pastr话题: char话题: include
进入Programming版参与讨论
1 (共1页)
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谁就负责清掉.
1 (共1页)
进入Programming版参与讨论
相关主题
What is wrong with the constructor calling?请问strcpy()和memcpy()的写法问题  (转载)
a c++ question.请教一道c/c++题
一道笔试题c的问题
帮忙找个错strcat()
帮忙看看这几段程序有问题吗?C++ STL map find does not work ???
问个c语言的问题New C++ programmer, need to ask a I/O file read question
随手写的C程序,请指教Array in C
请帮忙看看这个字符函数的错误在哪里weird output
相关话题的讨论汇总
话题: comm话题: para话题: pastr话题: char话题: include