【发布时间】:2015-11-13 04:29:44
【问题描述】:
我的目标是循环通过一组预定义的字符串,同时在自己的行上打印每个字符串,而不使用计数器变量。我注释掉的行是工作代码,但需要一个计数器。它下面的四行把我难住了。
int main(int argc,char* argv[]){
char *astring[500];
astring[0]=(char*)"ABC";
astring[1]=(char*)"DEF";
astring[2]=(char*)"GHI";
astring[3]=(char*)NULL;
//long count;
//for (count=0;count<4;count++){
//printf("%s\n",astring[count]);
//}
char *p=*astring;
while (*p++){
printf("%s\n",*p);
}
return 0;
}
我尝试了以下变体但没有成功。
这段代码:
char *p=*astring;
while (*p++){
printf("%s\n",*p);
}
编译正常,但在执行时,发生分段错误错误,程序立即退出。
我试过了:
while (**p++){
printf("%s\n",*p);
}
由于invalid type argument of 'unary *',程序无法编译。
然后我把char *p=*astring;改成了char *p=astring;,收到了initialization from incompatible pointer type的警告
然后我也尝试了char *p=**astring; 并收到此编译器警告:initialization makes pointer from integer without a cast
我一定是对星星感到困惑,还是我试图做的事情是不可能的?有人有解决办法吗?
【问题讨论】:
-
为什么
p不被视为“计数变量”? -
char *p=astring;怎么样?还是char *p=&(astring[0];? -
为什么
astring[0] = (char*)"ABC"; ...有演员表? -
@Mike 幸运的是,除非您有一个非常旧的系统,或者正在编写系统软件,否则应用程序段错误很少会使您的整个机器崩溃。其次,强制转换通常会降低代码的安全性,因为它们对编译器隐藏了信息。类型转换对编译器说“看,我知道它看起来像 X 类型,但假装它是 Y 类型”。通常编译器比程序员更了解它的类型。
-
仅供参考,没有演员表和 const 正确性,see it live
标签: c arrays pointers gcc char