2012-02-22 43 views
0

我很困惑于C中的指针。我发现很难围绕创建它们并将东西传递给周围?我添加了代码之后出现了“分段错误:11”错误,在此之前它已运行。需要添加一些东西。这是部分代码:如果在C中没有使用指定大小的括号,数组指针是如何创建的?

char *token2; 
char *line2; 
char comma_loc = 0; 
int num_of_commas = 0; 
char *line2[1]; 

while(token != NULL) { //lets make sure token has a string token 
     //printf("Wats in token: %s\n", token); 
     if(key==true) { 
      //printf("This should be an identifier: %s\n", token); 

      if(comma != true) { //added if statement, just take away if it fails, the first case is the original 
      int len = strlen(token); 
      iden_holder[iden_holder_count] = (char *)malloc(sizeof(char) * (len +1)); 
      memcpy(iden_holder[iden_holder_count], token, len +1); 
      iden_holder_count++; 
      key = false; 
      } else { 

       int len2 = strlen(token); 
       line2[0] = (char *)malloc(sizeof(char) * (len2 + 1)); 
       memcpy(line2[0], token, len2 + 1); 
       token2 = strtok(line2[0],","); 
        while(token2 != NULL) { 
          int len = strlen(token2); 
          iden_holder[iden_holder_count] = (char *)malloc(sizeof(char) * (len +1)); 
          memcpy(iden_holder[iden_holder_count], token, len +1); 
          iden_holder_count++; 
          token2 = strtok(line2[0],","); 
         } 
       key = false; 

      } 

这段代码的一点是要采取内令牌字符串,并将其复制到另一个道理,在我的情况token2。我决定使用memcpy,但由于指针混淆,我很困惑如何使用它。我还应该注意到,在此之前我使用了strtok,并且这里的代码位于其中。难道如果我再次使用它会覆盖另一个呢?

+1

阅读[6。 Arrays and Pointers](http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr)非常仔细地阅读,特别是问题6.2和6.3。 – 2012-02-22 21:51:46

+0

非常感谢@Jesse!指针上的解释页面是我见过的最好的。它使它有道理。对此,我真的非常感激。 – Andy 2012-02-22 22:04:50

+0

没问题,如果你有时间的话,从前面读回整个东西:)。 – 2012-02-22 22:06:51

回答

2

完全读取this。它会帮助你理解你的基础知识。它对我有用。 :)

+0

还学会使用调试器,以便您可以找出发生分段错误的代码行,并在发生时查看所有变量的值。 – 2012-02-22 06:52:14

+0

感谢您的链接,我一定会研究它@DavidGrayson谢谢 – Andy 2012-02-22 14:23:27

1

指针正是:指针。他们打算指向某些东西。绝大多数问题的人有指针是,他们没有指向任何地方的智能:-)

考虑下面的代码:

char xyzzy[] = "hello"; 
char *pch; 

在基于堆栈的C语言实现,这将可能给你包含字符串和指向任意值的指针的堆栈。

指针在堆栈上存在像其他变量一样,但它可以指向任何地方。

如果再执行:

pch = xyzzy; 

它设置为指向的xyzzy第一个字符(h)。数组和指针不同的野兽。例如,您不能增加xyzzy以指向该字符串的第二个字符,但可以增加pch

出现混淆的原因是,在相当多的情况下,数组将衰减为指向该数组的第一个元素的指针。

这就是基本上你不需要[]指针的原因,因为它们不是数组。他们不知道也不在乎他们指向的内存中可能存在多少事物,他们唯一关心的是他们当前指向的东西。

将指针移动到整个数组中,并确保您不会走到尽头,是您作为程序员必须执行的额外管理。

+0

你是什么意思'你不能增加xyzzy指向该字符串的第二个字符'。做*(xyzzy + 1)'很好。 – 2012-02-22 06:58:03

+0

@Jesse,那不是_incrementing_'xyzzy',它是一个计算'xyzzy + 1'的表达式,保持'xyzzy'不变。我的意思是你不能做像xyzzy ++这样的东西。 – paxdiablo 2012-02-22 07:00:53

+0

我明白了,我误解了递增意味着“添加”。谢谢。 – 2012-02-22 07:08:07