首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问char**指针时的分段错误

访问char**指针时的分段错误
EN

Stack Overflow用户
提问于 2022-06-19 15:37:34
回答 1查看 95关注 0票数 1

我试图编写一个函数,将char**数学表达式分解为它的成分。例如,“(10-2)/ 2”将变成{ (,10,-,2,),/,2 }。

由于给出了问题描述,返回类型必须是char** (指向字符指针的指针,但本质上是字符串数组)。我是C/++的初学者,所以目前我对指针和内存管理相当陌生。

代码语言:javascript
复制
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循环第一次运行时突然停止。我决定尝试调试这个程序,并在这一行中得到了一个分段错误:

代码语言:javascript
复制
arr[index] = intTocharStar(num);

这就是从输入中解析的int作为char*被添加到输出char**的地方。在这里阅读之后,我尝试将其更改为:

代码语言:javascript
复制
strcpy(arr[index], intTocharStar(num));

但我还是有同样的分割错误。我还编写了一个简短的程序,其中一个char*只是在主函数中的char**的第一个索引中进行了strcpy,并得到了同样的分段错误,所以我认为问题要么是访问arr的那一行,要么是声明它的这一行:

代码语言:javascript
复制
char **arr = (char**)malloc(1024 * sizeof(char*));

然而,根据我所读到的,这似乎是声明指针和为指针分配内存的标准方法。是否有我正在监督的东西,或者有进一步调试的方法?

EN

回答 1

Stack Overflow用户

发布于 2022-06-19 17:23:56

你在这里犯的错误很少,但我只会解释一个错误,它可能会解决你所有的记忆问题。

代码语言:javascript
复制
char **arr = (char**)malloc(1024 * sizeof(char*));

您想要分配char的矩阵,而真正要做的是为char的指针分配一个指针数组。这意味着您将分配1024*8(如果这是64位编译器)指针指向char的指针。您没有为1024个字符串分配足够的位置,而是将空间分配给指针。更好的方法是分配一个字符串数组:

代码语言:javascript
复制
char** arr= new char*[1024];

对于每个字符串,您应该分配内存。例如:

代码语言:javascript
复制
arr[0] = new char[20];

当然,最后您应该释放您分配的每个字符串和arr变量。

代码语言:javascript
复制
delete arr[0]; //delete one string
delete[] arr; // delete arr char**

通常,您最好将其转换为字符串数组,并使用字符串而不是char** (这将满足您管理内存的需要)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72678220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档