char []和char *兼容性?

时间:2012-12-02 22:54:50

标签: c arrays c-strings

从本质上讲,这段代码会起作用吗?在你说“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的长度?

4 个答案:

答案 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)

关于问题的最后部分 - wordsarray of pointers to character strings,写作words[i] = temp会使该数组的ith元素指向字符串{{ 1}}。

只要您不需要创建单词[i]应指向的临时副本,您就不需要temp新内存。