|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Mr丶张 于 2020-3-8 19:07 编辑
- #include <stdio.h>
- int main(void)
- {
- char *array[5] = {
- "FishC",
- "Five",
- "Star",
- "Good",
- "WoW"
- };
- char *(*p)[5] = &array;
- int i , j;
- for (i = 0 ; i < 5; i++)
- {
- for (j = 0 ; *(*p)[j] != '\0' ; j++)
- {
- printf("%c",*(*p)[j]);
- }
- printf("\n");
- }
-
- return 0;
- }
复制代码
为什么最后输出会是段错误呢?
本帖最后由 major_lyu 于 2020-3-8 19:43 编辑
代码帮你改了,错误位置看注释。
你需要好好理解一下指针和指针数组,以及数组指针的含义,感觉你理解混乱了。
另外这种指针定义比较复杂,代码可读性差,还容易造成逻辑错误,个人建议尽量不要这么用。
- #include <stdio.h>
- int main(void)
- {
- char *array[5] = {
- "FishC",
- "Five",
- "Star",
- "Good",
- "WoW"};
- char *(*p)[5] = &array;
- int i, j;
- for (i = 0; i < 5; i++)
- {
- //for (j = 0 ; *(*p)[j] != '\0' ; j++) // (*p)[j]表示的是array中第j个字符串的首地址,你这样循环下去,打印出来的是每一个字符串的第0号字符,所以不会碰到字符串结尾字符’\0'。当打印完最后一个之后,j=5时,指针指向的就是一个未知位置,当然段错误了。
- for (j = 0; *((*p)[i]+j) != '\0'; j++) // (*p)[i]是第i个字符串的首地址,(*p)[i]+j是第i个字符串的第j个字符,这样才是按照字符串的维度打印每个字符串,才会在每个字符串结尾遇到‘\0'从而结束循环,从而不会地址越界产生段错误。
- {
- printf("%c", *((*p)[i]+j));
- }
- printf("\n");
- }
- return 0;
- }
复制代码
|
|