打印
[嵌入式linux]

求助关于C++ char*型传参的错误之原因

[复制链接]
1579|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
h_8816002|  楼主 | 2017-9-27 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好
                原函数:
                send(char* a,char* b,char* c,char* d)
                {
                        打印a-d,d值不正确,d的值和b是一样的;
                       
                }
               
                int main(int argc,char*argv[])
                {
                        char bf[4][20];
                        for(i=0;i<argc,i++)
                        {
                                bf[i]=argv[i];
                        }
                        打印bf[1-4],值正确;
                        send(bf[1],bf[2],bf[3],bf[4]);
                }
这种情况下,bf[4]的值进入send函数后出现了错误,并不是预定的值而是和bf[2]一样。监测情况传参之前是正确的,传参后错误。命令行传入的字符串没有越界,最多就是“1010“。

调试后,如果改变send函数的入参类型,改为
                send(string a,string b,string c,string d)
                {
                        打印a-d,正确无误;
                        使用c_str()转换后数值也无误;
                }
请问这是怎么回事呢?我百思不得其解,谢谢!

相关帖子

沙发
feelhyq| | 2017-9-27 16:18 | 只看该作者
send(bf[1],bf[2],bf[3],bf[4]); 不是应该是  send(bf[0],bf[1],bf[2],bf[3]);吗?  bf[4]应该没有了吧,这不是越界了吗?

使用特权

评论回复
板凳
h_8816002|  楼主 | 2017-9-27 16:52 | 只看该作者
feelhyq 发表于 2017-9-27 16:18
send(bf[1],bf[2],bf[3],bf[4]); 不是应该是  send(bf[0],bf[1],bf[2],bf[3]);吗?  bf[4]应该没有了吧,这 ...

没有越界,命令行调用了这个函数的进程,传入的是char*argv[],b[0]是文件名,从b[1]开始才是数据。一共四个argc参数

使用特权

评论回复
地板
feelhyq| | 2017-9-27 17:15 | 只看该作者
h_8816002 发表于 2017-9-27 16:52
没有越界,命令行调用了这个函数的进程,传入的是char*argv[],b[0]是文件名,从b[1]开始才是数据。一共四 ...

那应该定义5个吧  char bf[5][20];  

使用特权

评论回复
5
h_8816002|  楼主 | 2017-9-27 17:35 | 只看该作者
feelhyq 发表于 2017-9-27 17:15
那应该定义5个吧  char bf[5][20];

那为啥该为string类型的入参就不会有少一个指针的问题了呢?

使用特权

评论回复
6
feelhyq| | 2017-9-27 17:49 | 只看该作者
h_8816002 发表于 2017-9-27 17:35
那为啥该为string类型的入参就不会有少一个指针的问题了呢?

你先改成  char bf[5][20]看看行不行,先出结果后讨论问题;  

使用特权

评论回复
7
h_8816002|  楼主 | 2017-9-27 18:05 | 只看该作者
feelhyq 发表于 2017-9-27 17:49
你先改成  char bf[5][20]看看行不行,先出结果后讨论问题;

对了,就是因为少一个指针,存放越界的问题,谢谢啊!
同样的情况下string就没问题,是不是string类对此类越界做过什么处理?呢

使用特权

评论回复
8
feelhyq| | 2017-9-27 18:09 | 只看该作者
h_8816002 发表于 2017-9-27 18:05
对了,就是因为少一个指针,存放越界的问题,谢谢啊!
同样的情况下string就没问题,是不是string类对此 ...

去百度以下就知道了,多看书,多写代码,多用指针

使用特权

评论回复
9
feelhyq| | 2017-9-27 18:12 | 只看该作者
本帖最后由 feelhyq 于 2017-9-27 18:36 编辑
feelhyq 发表于 2017-9-27 18:09
去百度以下就知道了,多看书,多写代码,多用指针


使用特权

评论回复
10
linqing171| | 2017-9-27 21:48 | 只看该作者
for(i=0;i<argc,i++)
                         {
                                 bf[i]=argv[i];
                         }

修改为
for(i=0;i<argc,i++)
                         {
                                 for(j=0;j<len(argv[I]);j++)
                                 bf[i][j]=argv[i][j];
                         }
或者内循环用strcpy
或者定义改一下 char *bf[5];
或者 。。。 。。。

使用特权

评论回复
11
dongshan| | 2017-9-28 10:47 | 只看该作者
没看出一点C++的味道? 起码应用string代替char *嘛。

使用特权

评论回复
12
h_8816002|  楼主 | 2017-9-28 13:39 | 只看该作者
dongshan 发表于 2017-9-28 10:47
没看出一点C++的味道? 起码应用string代替char *嘛。

我在这里手打伪代码,没带类名声明等,另外char*比string快好多,毕竟一个指针一个是类操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

143

帖子

5

粉丝