我是c编程新手。我做了一个解析器,它获取一个char数组(一个命令,后来也应该有参数),并应将它分成更小的数组。从那里我想进一步分析每个阵列自己。可能有更好的方法来解决这个问题,但我真的只是想了解这里发生了什么。
当我运行调试器时(是的,我确实运行了调试器),它告诉我此行存在分段错误。
commandArray[kk][ii - jj] = (char) input[ii];
这只发生在kk>之后3但适用于所有较小的数字。当我使用不同的字符串时,在kk> 3时也会出现同样的问题。 kk == 4 和(ii - jj)== 0 。
当我想用字符填充二维数组时会发生这种情况。
//fill each Array entry with a command (a command is just a string)
jj = 0;
kk = 0;
ii = 0;
while (ii != (int) strlen(input)) {
commandArray[kk][ii - jj] = (char) input[ii];
if ((char) input[ii] == ';') {
commandArray[kk][ii - jj + 1] = '\0';
jj = ii + 1;
kk++;
}
ii++;
}
我很确定我已正确声明了2d数组:
//allocate space for each command
commandArray = (char**) calloc(numberOfCommands, sizeof(char)); //create n char arrays
for (ii = 0; ii < numberOfCommands; ii++) {
commandArray[ii] = (char*) calloc((lengthOfCommand[ii]), sizeof(char));
}
我不知道你需要更多代码所以我用了pastebin来包含我的完整代码(~100行)
调用我的函数的Main:
完整的Parser.c文件:
和Parser.h:
#ifndef PARSER_H_
#define PARSER_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void command(char* commandArray);
#endif /* PARSER_H_ */
答案 0 :(得分:0)
每个命令条目都是char
s的字符串。当你为这些字符串分配内存时(我认为是正确的)你会得到指向每个字符串中第一个char
的指针。
因此,您的命令数组实现为指针的列表。但是当你为指针列表分配内存时,你只允许每个指针有足够的空间来容纳char
。指针值(本质上是一个内存位置)极不可能适合char
。
尝试更改您的第一个calloc
来电,以便第二个参数为sizeof(char *)
。
如果不清楚,编写一个小程序来打印sizeof(char)
和sizeof(char *)
可能会有所帮助。