2016-06-10 67 views
0

我一直在尝试c一段时间,但我无法处理指针数组。
例如添加一个字符串指针指针指向c中没有显示任何东西时访问

char *word; 
char *container[100]; 

在的字符串临时下面的for循环我正在追加单个字符然后我想要添加到容器* [100]如果定界符。出现

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 


int main() 
{ 
    int z = 0; 
    int k=0; 
    char *word; 
    char *container[100]; 
    char *in = " First Word . Second Word"; 
    for(k=0; k<strlen(in); k++) 
    { 
     //using . as a delimiter 
     if(in[k]=='.') 
     { 
      container[z] = word; 
      printf("%s\n", container[z]); //<---- this prints okey inside loop 
      z++; 
      memset(word,0,strlen(word)); 
     } 
     else 
     { 
      //appending characters to temp, using some method 
      snprintf(word + strlen(word), (sizeof word) - strlen(word), "%c", in[k]); 
     } 
    } 
//doesnt print anything outside the loop 
printf("Does it print: %s\n", container[0]); 
printf("Doest it print: %s\n", container[1]); 

    return 0; 
} 

当我尝试打印在容器它不显示任何东西的话:

printf("%s\n", container[0]); 
printf("%s\n", container[1]); 

我想我已经做某种动态分配的。但我不知道如何。

+3

请发表[mcve] –

+2

更好地解释你的代码,什么是温度?容器[z] ??? –

+0

你把它错了吗? '容器[z]'应该做什么? – Barmar

回答

1

指针word在开始使用它之前未被初始化。这会导致未定义的行为。如果幸运的话,你会得到一个分段错误,所以你意识到了这个问题并且可以解决它。如果你不走运,它有点作用,但会产生奇怪的副作用,如神秘覆盖其他变量。

此外,sizeof word返回指针大小,而不是它指向的(分配的)内存区域的大小。

word的问题可以通过固定使其成为一个数组:

char word[100]; 

现在word包含100个字节的内存,我们可以安全地写入,并sizeof word将评估为100

下一个问题是当您将container指针指向word时。这将而不是作为word中包含的字符串的副本。稍后当您覆盖单词的内容时,container[i]的内容也将被覆盖,因为它将指向相同的内存位置。您可以使用strdup创建一个动态分配的副本:

container[z] = strdup(word); 

注:strdup()是一个POSIX功能,而不是C规范的一部分。在没有strdup()的平台上,您可以使用malloc + strcpy执行相同的任务。

+0

yayy,修复它...我知道这是因为内存的位置,但不知道它。非常感谢你为我澄清这个概念。 :) –