我试图编写一个函数,将char**数学表达式分解为它的成分。例如,“(10-2)/ 2”将变成{ (,10,-,2,),/,2 }。
由于给出了问题描述,返回类型必须是char** (指向字符指针的指针,但本质上是字符串数组)。我是C/++的初学者,所以目前我对指针和内存管理相当陌生。
char* intTocharStar(int x) {
int length = snprintf( NULL, 0, "%d", x );
char* str = (char*)malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
return str;
}
char* convertChar(char c) {
char* pointer = (char*)malloc(2*sizeof(char));
pointer[0] = c;
pointer[1] = '\0';
return pointer;
}
char **tokenize(const char* input) {
char **arr = (char**)malloc(1024 * sizeof(char*));
char op;
int num;
int index = 0;
stringstream parser(input);
while (parser) {
if (isalnum(parser.peek())) {
parser >> num;
cout << "Num " << num << '\n';
//args[index] = intTocharStar(num);
strcpy(arr[index], intTocharStar(num));
} else {
parser >> op;
cout << "Op " << op << '\n';
//args[index] = convertChar(op);
strcpy(arr[index], convertChar(num));
}
index++;
}
char** res = (char **)malloc(100 * sizeof(char*));
// remove final element, which is a duplicate
for (int i = 0; i < index - 1; i++)
res[i] = arr[i];
free(arr);
return res;
}当我运行这段代码时,程序在for循环第一次运行时突然停止。我决定尝试调试这个程序,并在这一行中得到了一个分段错误:
arr[index] = intTocharStar(num);这就是从输入中解析的int作为char*被添加到输出char**的地方。在这里阅读之后,我尝试将其更改为:
strcpy(arr[index], intTocharStar(num));但我还是有同样的分割错误。我还编写了一个简短的程序,其中一个char*只是在主函数中的char**的第一个索引中进行了strcpy,并得到了同样的分段错误,所以我认为问题要么是访问arr的那一行,要么是声明它的这一行:
char **arr = (char**)malloc(1024 * sizeof(char*));然而,根据我所读到的,这似乎是声明指针和为指针分配内存的标准方法。是否有我正在监督的东西,或者有进一步调试的方法?
发布于 2022-06-19 17:23:56
你在这里犯的错误很少,但我只会解释一个错误,它可能会解决你所有的记忆问题。
char **arr = (char**)malloc(1024 * sizeof(char*));您想要分配char的矩阵,而真正要做的是为char的指针分配一个指针数组。这意味着您将分配1024*8(如果这是64位编译器)指针指向char的指针。您没有为1024个字符串分配足够的位置,而是将空间分配给指针。更好的方法是分配一个字符串数组:
char** arr= new char*[1024];对于每个字符串,您应该分配内存。例如:
arr[0] = new char[20];当然,最后您应该释放您分配的每个字符串和arr变量。
delete arr[0]; //delete one string
delete[] arr; // delete arr char**通常,您最好将其转换为字符串数组,并使用字符串而不是char** (这将满足您管理内存的需要)。
https://stackoverflow.com/questions/72678220
复制相似问题