从本质上讲,这段代码能工作吗?在你说“运行它看看!”之前,我刚刚意识到我的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这一行,也不确定我是否可以像现在这样给wordsi赋值当我最终尝试在40分钟内编译这段代码时,我会得到类型错误吗?
另外--如果可以,为什么不需要对words[]的每个元素使用malloc()呢?为什么我可以说words[i] = temp,而不是需要为临时长度的单词分配内存?
发布于 2012-12-03 07:05:43
这可能行不通,因为所有words[i]都将被设置为指向buffer + 4的相同位置。
然而,您的基本思想很好:您可以通过遵循相同的基本思想,将一个大的缓冲区“分割”成较小的“单词”。但是,您需要确保您没有指向缓冲区的相交区域,并且您所指向的单词所指向的区域以null结尾。
最后,每次遍历words[i]以查找下一个NULL的想法并不是最优的:您应该存储上一次写入的位置,在下一次写入时递增它,并删除while(words[i] != NULL)循环。
发布于 2012-12-03 06:57:42
在函数调用和指针运算中,char[]会衰减到char*。
所以从表面上看,你的代码是有效的C。
编辑
至于你添加的问题,你可以做word[i] = temp,因为类型是兼容的。编译器只检查类型安全(好吧,它做了更多的工作,但是在为什么这是一个语法上有效的赋值的上下文中...)。
发布于 2012-12-03 07:00:07
在gcc上测试过,它可以工作,但是除非你使用的是c99编译器,否则你需要在for循环之外声明i。
https://stackoverflow.com/questions/13674839
复制相似问题