user-0 提问: 关于指针数组的问题

回复:
user: user-0
content: 引用 5 楼 sdghchj 的回复:[quote=引用 3 楼 u011330815 的回复:] [quote=引用 2 楼 sdghchj 的回复:] 我相信没人会这样写代码的，首先你要搞清楚传值和传引用或指针的区别，然后再搞清一级指针和二级指针甚至三级以上的指针，搞清数组名和指针间的异同。一句话真说不清楚。  char *OutName[10] = {0};  GetName(OutName);  for(int i=0;i<10;i++)      //输出数组  函数调用： GetName(char **&Outname)  {  for(int i=0;i<10;i++)      Outname[i] = "asd";  } 问题已经解决了，主要是在调用函数的时候，指针指向临时变量了···[/quote] 指向的是常量，什么临时变量！[/quote] 因为我把指针数组传到函数中，函数结束后，指针指向的就是空地址了

user: user-1
content: 这样就ok了：  GetName(char *Outname[]) { 	for (int i = 0; i < 10; i++) 		Outname[i] = "asd"; } int main(void) { 	char *OutName[10]; 	GetName(OutName); 	for (int i = 0; i < 10; i++) 		printf("%s\n", OutName[i]); 	return 0; }

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 引用 3 楼 u011330815 的回复:[quote=引用 2 楼 sdghchj 的回复:] 我相信没人会这样写代码的，首先你要搞清楚传值和传引用或指针的区别，然后再搞清一级指针和二级指针甚至三级以上的指针，搞清数组名和指针间的异同。一句话真说不清楚。  char *OutName[10] = {0};  GetName(OutName);  for(int i=0;i<10;i++)      //输出数组  函数调用： GetName(char **&Outname)  {  for(int i=0;i<10;i++)      Outname[i] = "asd";  } 问题已经解决了，主要是在调用函数的时候，指针指向临时变量了···[/quote] 指向的是常量，什么临时变量！

user: user-4
content: #include <iostream>  void GetName( char  const * outname[] ); int main( ) {         char const *OutName[10] = { NULL };         GetName(OutName);         for(int i=0; i<10; i++)             std::cout<< OutName[i]<< std::endl;         return 0; }  void GetName( char const * Outname[] ) {         for(int i=0;i<10;i++)             Outname[i] =  "asd"; }   以上可以使用g++直接编译运行。楼主找到了问题的地方，原来的那个赋值语句 char *OutName[10] = "0"  是一个本质性的错误。从类型匹配的角度都能够嗅出一点不好的味道。因为左端本质是一个二阶指针，右端的本质是指向内存常数段的一个一届指针。 且不管楼主怎样让编译器做出各种转型，我们看看你把这个指针传给GetName以后会发生生么事。  for 循环里面的第一次赋值，做了一次解析引用，然后把另外一个指针赋给了原来值为 ‘0’ ‘\0'的地方。之后的赋值（如果能执行的话）其实是在污染内存，因为那些地址程序根本没有申请。  为什么 const char *OutName[10]= { NULL }; 能工作 ？ 这是数组初始化的时候发现左边需要10个 const char *的指针，而右端只有一个元素，于是编译器使用 0 转型以后补满了其他9个值。注意，这是C有关数组初始化的已定义行为，什么时候都可以安全利用。

user: user-5
content: 没看出调用和传参有什么问题。就是那个指针数组的初始化不对吧；char *OutName[10] = {NULL};

user: user-0
content: 引用 2 楼 sdghchj 的回复:我相信没人会这样写代码的，首先你要搞清楚传值和传引用或指针的区别，然后再搞清一级指针和二级指针甚至三级以上的指针，搞清数组名和指针间的异同。一句话真说不清楚。  char *OutName[10] = {0};  GetName(OutName);  for(int i=0;i<10;i++)      //输出数组  函数调用： GetName(char **&Outname)  {  for(int i=0;i<10;i++)      Outname[i] = "asd";  } 问题已经解决了，主要是在调用函数的时候，指针指向临时变量了···

user: user-3
content: 我相信没人会这样写代码的，首先你要搞清楚传值和传引用或指针的区别，然后再搞清一级指针和二级指针甚至三级以上的指针，搞清数组名和指针间的异同。一句话真说不清楚。  char *OutName[10] = {0};  GetName(OutName);  for(int i=0;i<10;i++)      //输出数组  函数调用： GetName(char **&Outname)  {  for(int i=0;i<10;i++)      Outname[i] = "asd";  }

user: user-0
content: 我在GetName(char *Outname[])函数里面输出数组的结果是对的，然后调用函数结束后，输出数组就是乱码。这是为什么？