【问题标题】:c function is not workingc函数不工作
【发布时间】:2013-11-24 19:20:28
【问题描述】:

所以当我使用以下代码测试时,我在段错误中实现了以下 c 函数:

char line1[] = "sw $s2, 0($s3)";
char* bc = removeAFromABC(line1);

这个方法应该返回一个字符指针 = "$s2, 0($s3):

char* removeAFromABC(char* abc) {
    char* a = strtok(abc, " $,\t\n");
    char* b = strtok(NULL, " \t");
    char* c = strtok(NULL, " \t");
    char bc[MAXIMUM_LINE_LENGTH + 1];
    strcpy(bc, b);
    strcat(bc, c);

    return bc;
}

【问题讨论】:

标签: c segmentation-fault char-pointer


【解决方案1】:

'bc' 在堆栈上分配。当函数返回时该地址无效。

试试这样的:

char bc[MAXIMUM_LINE_LENGTH + 1];

void removeAFromABC(char* abc, char * bc, int size) {
    char* a = strtok(abc, " $,\t\n");
    char* b = strtok(NULL, " \t");
    char* c = strtok(NULL, " \t");

    /* TODO: use the size parameter here for checking...*/
    strcpy(bc, b);
    strcat(bc, c);
}

【讨论】:

    【解决方案2】:

    您的返回类型为char *,因此 bc 声明为:

    char bc[MAXIMUM_LINE_LENGTH + 1];
    它不是合法的返回类型。 (它不会那样构建)

    试试这个:

    #include <ansi_c.h>
    #include <windows.h>
    
    #define MAXIMUM_LINE_LENGTH 260
    char* removeAFromABC(char* abc);
    
    int main(void)
    {
        char line1[] = "sw $s2, 0($s3)";
        char* bc = removeAFromABC(line1);
        printf("bc is %s", bc);
        return 0;
    }
    
    char* removeAFromABC(char* abc) 
    {
        char* a = strtok(abc, " $,\t\n");
        char* b = strtok(NULL, " \t");
        char* c = strtok(NULL, " \t");
        char *bc = malloc(MAXIMUM_LINE_LENGTH); //to match return type
        strcpy(bc, b);
        strcat(bc, c);
    
        return bc;
    }
    

    注意:我没有完全重构您的代码,但它确实需要做更多的工作。即根据需要分配和释放内存。

    【讨论】:

      【解决方案3】:

      bc 是函数removeAFromABC 的自动局部变量。永远不要返回指向 自动 局部变量的指针。因为一旦removeAFromABC返回,变量bc就不存在了,所以指向它的指针就失效了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 2018-12-09
        相关资源
        最近更新 更多