0

因此,当我使用以下代码对其进行测试时,我在 segfaulting 中实现了以下 c 函数:

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

这个方法应该返回一个 char 指针 = "$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;
}
4

3 回答 3

0

'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);
}
于 2013-11-24T19:22:29.850 回答
0

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

于 2013-11-24T19:30:09.550 回答
0

您的返回类型为char * so , 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;
}

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

于 2013-11-24T19:31:19.210 回答