欢迎参与讨论,转载请注明出处。
前言
近期遇到个C语言的课题作业,要求完成parse功能(以空格、回车、TAB为分割符分割字符串,输出结果且返回数组。)该功能涉及到strtok函数的一些问题,特此开贴记录。
详解
以下为程序源码:
|
|
第一个问题
首先第一个问题便是这里:
|
|
最初尝试直接把parse函数的参数line直接作为strtok函数的第一参数填入,结果不行。查阅文档后发现strtok的声明为:
|
|
可以发现,第一参数char * str要求的并非const,而我在调用时填入的参数为‘system program’,这种字符串数据是作为‘const char[]’保存在字符串常量区的,故不符合参数需求。需要重新申请一片栈空间复制line的内容再作为参数填入。
第二个问题
由此衍生的第二个问题便是:为何要为newArgv[i]申请新的空间,而非newArgv[i] = cur->value;
?
|
|
这一点的原因主要是 strtok返回的字符串其实并非新的副本,而是从str上截取的一部分而已。 而cur->value便是来自于str,且str是拥有生命周期的栈数据,而如果将这样的部分保存在newArgv后返回到外部,便会因为生命周期问题,导致数据被回收。这将会产生很可怕的后果。所以必须申请新的空间,形成复制。
后记
没有垃圾回收的C/C++,编程时必须对内存的分配和流向必须要有十分清晰的认识,不然就很容易发生内存泄漏和野指针现象。慎之、慎之。