[问题] 请问char**array的问题

楼主: Keitaro (动き出す时间...)   2020-11-10 19:53:34
开发平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu 18.04 LTS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://ideone.com/jugcYC
重新上传完整原始码
补充说明(Supplement):
程式码如以上连结
想请教版上各位先进 我的程式码这一段是否出了什么问题
这段code作用是这样的
1. 我要写一个自己用的CreateProcess() 在linux底下去call process起来做事
2. 中间是fork...exec 因为前面印出来就发现有问题了
我觉得应该是跟fork以后开始没关系
3. 传进来的参数
p_sAppName: process name
p_sCmdArg: parameter, 以空白切割, 所以我会去呼叫一个自己写的ParserCmd()
去把传进来的参数去parser成一个vector<string> 把所有参数放里面
ParserCmd()的结果我确定是对的所以忽略不贴
p_sEnvArg: 环境变量的参数, 作法如同上面的p_sCmdArg
p_nRetVal: 在fork()...exec()这段拿来回传呼叫process的成功或失败
假设我今天call这个function的呼叫方式是这样
MyCreateProcess("ffmpeg", "-vsync 0 -i file.cfg Compare.yuv");
p_sEnvArg/p_nRetVal有默认值NULL
我预计进入function后
1. 传进来的p_sCmdArg, 会被ParserCmd()拆解然后存每一个cmd在vector里面
2. 由于execve需要传参数/环境变量型态为char**, 所以我先
char **ppCmdArg = new char*[vCmdSet.size() + 1];
然后在循环中, 针对于每一个ppCmdArg[i], 我再
ppCmdArg[i] = new char[vCmdSet[i].length() + 1];
由于参数不可能每个长度都相同 因此new出来的结果长度都不相同
3. 接下来我再把vector里面储存的参数字串拷贝到new出来的char* ppCmdArg[i]
4. 如果有传环境变量我也是做一样的处理 这次范例没有可以无视
5. 接着就把ppCmdArg给execve当参数呼叫process
结果我发现程式在结束的地方 我做delete[] array出了问题
然后我把这段程式码加了printf做debug
看到了无法理解的结果
输出:
作者: nh60211as   2020-11-10 20:32:00
ppCmdArg[vCmdSet[i].length()] = 0; 你这行是做什么的还有你都写C++了有什么必要是要用C-style字串吗
作者: Lipraxde (Lipraxde)   2020-11-10 20:42:00
L44、L62 在干嘛?省略 code 可以,但是请弄一个 minimal working example 出来。不然看 code 还要脑补省略的部分有没有可能出问题很累,又不是在猜灯谜 = =
作者: nh60211as   2020-11-10 21:28:00
字串的结尾是ppCmdArg[i][vCmdSet[i].length()]
作者: ucrxzero (RX-0)   2020-11-10 21:28:00
58行 ppCmdArg[vCmdSet[i].length()] = 0;错两个地方
作者: stucode   2020-11-10 21:29:00
其实一楼已经说出问题所在了,L58
作者: nh60211as   2020-11-10 21:29:00
ppCmdArg[x]是char** ppCmdArg的第x个位置
作者: ucrxzero (RX-0)   2020-11-10 21:29:00
ppCmdArg[i][vCmdSet[i].length()] = \0;不是0 是null才对刚好其他人都有解出来请楼主帮我把整个有我的推文全删还有strcpy本来就会复制\0过去了要不然strcpy这么聪明就不会跟get一样列为危险函示了
作者: Lipraxde (Lipraxde)   2020-11-10 22:01:00
仔细对照一下 L56、L58、L61,再想想看 L58 真的有写出你想要的意思吗?当 i = 2 or 3 的时候 L58 做了什么?另外 L110~L129 建议是拿 man waitpid 里的范例来改
作者: nh60211as   2020-11-10 22:21:00
抱歉,看到后面的code应该真的只能用char**来写
作者: ucrxzero (RX-0)   2020-11-10 23:40:00
C++写法 (可过): vector<char*> char_vtrvector<char*> env_vtrexecve(proc_name, &char_vtr, &env_vtr)execve(proc_name, &char_vtr[0], &env_vtr[0])但不建议使用
作者: Killercat (杀人猫™)   2020-11-27 14:25:00
好像并不是所有的STL都保证data内存位置在前面建议用std::vector::data取得资料段的pointer比较保险

Links booklink

Contact Us: admin [ a t ] ucptt.com