从本质上讲,这段代码会起作用吗?在你说“Run it and see!”之前,我刚刚意识到我的cygwin没有配备gcc,而且距离完成重新安装还有40分钟。话虽如此:
char* words[1000];
for(int i = 0; i<1000; i++)
words[i] = NULL;
char buffer[ 1024 ];
//omit code that places "ADD splash\0" into the buffer
if(strncmp (buffer, "ADD ", 4) == 0){
char* temp = buffer + 4;
printf("Adding: %s", temp);
int i = 0;
while(words[i] != NULL) i++;
words[i] = temp;
}
我最不确定行char* temp = buffer + 4
,以及我是否可以按照我的方式分配单词[i]。当我最终在40分钟内尝试编译时,我是否会遇到类型错误?
另外 - 如果这有效,为什么我不需要在单词[]的每个元素上使用malloc()?为什么我可以说words[i] = temp
,而不是需要为单词分配内存[i] temp的长度?
答案 0 :(得分:0)
char[]
在函数调用和指针算术中衰减到char*
。
因此,从一目了然,您的代码是有效的C.
修改强>
至于您添加的问题,您可以执行word[i] = temp
因为类型兼容。编译器只检查类型安全性(嗯,它确实有很多,但在上下文中为什么这是一个语法上有效的赋值...)。
答案 1 :(得分:0)
在gcc上测试它会起作用,但是除非你使用c99编译器,否则你需要在for循环之外声明我。
答案 2 :(得分:0)
这可能不起作用,因为所有words[i]
都将设置为指向buffer + 4
的相同位置。
然而,你的基本想法很好:你可以通过遵循相同的基本思想,将大缓冲区“包裹”成更小的“单词”。但是,您需要确保不指向缓冲区的交叉区域,并且指向单词的区域以空值终止。
最后,通过words[i]
遍历每次查找下一个NULL
的想法不是最理想的:您应该存储您编写的最后一个位置,在下次写入时递增它,然后删除while(words[i] != NULL)
循环。
答案 3 :(得分:0)
关于问题的最后部分 - words
是array of pointers to character strings
,写作words[i] = temp
会使该数组的ith
元素指向字符串{{ 1}}。
只要您不需要创建单词[i]应指向的临时副本,您就不需要temp
新内存。