2012-12-02 41 views
1

从本质上说,这个代码能工作吗?在你说“运行并看看!”之前,我刚刚意识到我的cygwin没有带有gcc,现在距离重新安装完成40分钟。话虽这么说:char []和char *兼容性?

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,以及是否我可以分配字[我]在我的方式。当我最终尝试在40分钟内完成编译时,我是否会遇到类型错误?

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

+0

'char * words [1000] = {0}'将初始化它而不进行循环。 –

回答

0

这可能不会起作用,因为所有words[i]将被设置为指向buffer + 4的相同确切位置。

但是,您的基本想法很好:您可以通过遵循相同的基本思路将“大型缓冲区”分解为更小的“单词”。但是,您需要确保您不指向缓冲区的相交区域,并且指向您的单词的区域以null结尾。

最后,虽然走路到words[i]找到下一个NULL每一次的想法是不理想的:你应该存储最近位置,它是你写的,增加它在下一个写,并删除while(words[i] != NULL)循环。

+0

我理解你的第三段,但第一部分让我不确定如何继续。我明白你的观点 - '我将'指出可能会改变的内存位置。那么我怎样才能制作一个副本呢? 'strcpy(temp,buffer + 4)'有效吗? – Aerovistae

+1

@Aovovistae我的理解是,你打算在循环中执行if(strncmp ...)代码,如果'buffer'被分配在静态内存中(静态或全局),你不需要复制它内容或使用'malloc';另一方面,如果它是本地的,则需要使用'strdup'或'malloc''' memcpy'或'strcpy'来避免引用不稳定。 – dasblinkenlight

0

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

所以从一眼,你的代码是有效的C.

编辑

至于你的问题补充,你可以做word[i] = temp因为类型兼容。编译器只检查类型安全性(好吧,它确实更多,但是为什么这是一个语法上有效的赋值......)。

+0

刚刚添加了一个部分给我的问题。 – Aerovistae

0

在gcc上测试它,它会工作,但是除非你使用c99编译器,否则你需要在for循环之外声明我。

+0

刚刚在我的问题中增加了一个部分。 – Aerovistae

0

关于你的问题的最后一部分 - wordsarray of pointers to character strings,写words[i] = temp使得该阵列指向字符串tempith元素。

只要您不需要创建temp [我]应该指向的临时副本,则不需要malloc新内存。