1

本质上,这段代码会起作用吗?在你说“运行它看看!”之前,我刚刚意识到我的 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;
}

我主要不确定 line char* temp = buffer + 4,以及我是否可以按照我的方式分配 words[i] 。当我最终尝试在 40 分钟内编译它时,我会得到类型错误吗?

另外——如果这可行,为什么我不需要在 words[] 的每个元素上使用 malloc()?为什么我可以说words[i] = temp,而不是需要为 words[i] 分配内存 temp 的长度?

4

4 回答 4

0

char[]衰减到char*函数调用和指针算术。

因此,乍一看,您的代码是有效的 C。

编辑

至于您添加的问题,您可以这样做,word[i] = temp因为类型是兼容的。编译器只检查类型安全(嗯,它做的更多,但是在为什么这是一个语法上有效的赋值的上下文中......)。

于 2012-12-02T22:57:42.063 回答
0

在 gcc 上对其进行了测试,它会起作用,但是除非您使用 c99 编译器,否则您需要在 for 循环之外声明 i 。

于 2012-12-02T23:00:06.573 回答
0

这可能行不通,因为 allwords[i]将被设置为指向buffer + 4.

但是,您的基本想法很好:您可以按照相同的基本想法将大缓冲区“拆分”成较小的“单词”。但是,您需要确保您不指向缓冲区的相交区域,并且您所指向的区域是空终止的。

最后,每次都遍历words[i]查找下一个的想法NULL是次优的:您应该存储您写入的最后一个位置,在下一次写入时增加它,并删除while(words[i] != NULL)循环。

于 2012-12-02T23:05:43.307 回答
0

关于你问题的最后一部分 -words是一个array of pointers to character strings并且写作words[i] = temp使该ith数组的元素指向字符串temp

只要您不需要创建 words[i] 应该指向的 temp 的副本,就不需要malloc新的记忆。

于 2012-12-03T00:43:43.563 回答