求助,关于C语言字符串数组函数问题

心空之上 2018-08-13 10:50:36
我编写了一个打印字符串数组的函数,但是将字符串数组作为参数传入函数却无法打印,而设置一个指向字符串的指针数组传入函数就能打印了,这是为什么?
#include <stdio.h>
#include <string.h>

#define SIZE 256
#define LIM 2

void print_string(char **st, int lim);

int main(void)
{
char input[LIM][SIZE] = {
"my",
"be"
};
print_string(input, LIM);

return 0;
}

void print_string(char **st, int lim)
{
int i;
for(i = 0; i < lim; i++)
puts(st[i]);
}
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
月凉西厢 2018-08-14
  • 打赏
  • 举报
回复
你可以想一下,在功能函数的内部 指针(st+1)到底是指向本行的下一个元素,还是下一行呢?如果按照你的逻辑,它指向下一行,那么它是如何知道指针+1的操作是指针偏移了多少个char?
心空之上 2018-08-14
  • 打赏
  • 举报
回复
谢谢楼上各位,讲解得很细致,我已经明白了
zhao_miao 2018-08-14
  • 打赏
  • 举报
回复
1.void print_string(char (*st)[256], int lim);
2.void print_string(char [LIM][256], int lim);
3.void print_string(char [ ][256], int lim);
这三种方式均可以。
二维数组传参自然可以用二维数组来接收。所以2,3成立
print_string(input, LIM);中input指的是二维数组首元素的地址,二维数组首元素的地址为第一行的地址,但第一行为一个字符串数组,需要用数组指针来接收。所以1成立。
sghcpt 2018-08-14
  • 打赏
  • 举报
回复
楼主,可以查查“二维数组传参”相关字眼,有相应的文章说明二维数组传参的方法。下面是其中一种方法:
#include <stdio.h>
#include <string.h>

#define SIZE 256
#define LIM 2

void print_string(char st[][SIZE], int lim);

int main(void)
{
char input[LIM][SIZE] = {
"my",
"be"
};
print_string(input, LIM);

return 0;
}

void print_string(char st[][SIZE], int lim)
{
int i;
for (i = 0; i < lim; i++)
puts(st[i]);
}


而至于你上面说的为什么不能用char**str作为参数,因为当把这种二维数组的指针直接作为参数传递时,数组名退化为指针,函数并不知道数组的列数,SIZE对它来说是不可见的,所以第一层解引用会失败。这时,编译器可能会报warning,或者运行生成的文件会发生segment fault。引用网友在文章的图说明:(链接:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html)

栈上分配的二维数组数组名int array[3][3]的真实类型是int [ ][ ],在作为右值时才被转化为(int *array)[N],和int **是不同的。把前者进行强制转换为后者,在函数中对元素操作也会导致段错误,上图面用图来说明二者区别。
_肆 2018-08-14
  • 打赏
  • 举报
回复
正确的写法是void print_string(char (*st)[256], int lim),你用char**也是不严谨的,因为你的input是个二维数组,char*只能表示一维数组

况且**叫指向指针数据的指针,char (*st)[256]叫数组指针,char *st[256]叫指针数组

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧