如果在C中没有使用指定大小的括号,数组指针是如何创建的?
我很困惑于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,并且这里的代码位于其中。难道如果我再次使用它会覆盖另一个呢?
指针正是:指针。他们打算指向某些东西。绝大多数问题的人有指针是,他们没有指向任何地方的智能:-)
考虑下面的代码:
char xyzzy[] = "hello";
char *pch;
在基于堆栈的C语言实现,这将可能给你包含字符串和指向任意值的指针的堆栈。
指针在堆栈上存在像其他变量一样,但它可以指向任何地方。
如果再执行:
pch = xyzzy;
它设置为指向的xyzzy
第一个字符(h
)。数组和指针很不同的野兽。例如,您不能增加xyzzy
以指向该字符串的第二个字符,但可以增加pch
。
出现混淆的原因是,在相当多的情况下,数组将衰减为指向该数组的第一个元素的指针。
这就是基本上你不需要[]
指针的原因,因为它们不是数组。他们不知道也不在乎他们指向的内存中可能存在多少事物,他们唯一关心的是他们当前指向的东西。
将指针移动到整个数组中,并确保您不会走到尽头,是您作为程序员必须执行的额外管理。
你是什么意思'你不能增加xyzzy指向该字符串的第二个字符'。做*(xyzzy + 1)'很好。 – 2012-02-22 06:58:03
@Jesse,那不是_incrementing_'xyzzy',它是一个计算'xyzzy + 1'的表达式,保持'xyzzy'不变。我的意思是你不能做像xyzzy ++这样的东西。 – paxdiablo 2012-02-22 07:00:53
我明白了,我误解了递增意味着“添加”。谢谢。 – 2012-02-22 07:08:07
阅读[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
非常感谢@Jesse!指针上的解释页面是我见过的最好的。它使它有道理。对此,我真的非常感激。 – Andy 2012-02-22 22:04:50
没问题,如果你有时间的话,从前面读回整个东西:)。 – 2012-02-22 22:06:51