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

戻り値の型が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 に答える
0

bc関数への自動ローカル変数ですremoveAFromABC自動ローカル変数へのポインターを返さないでください。なぜなら、変数bcは一度返されると存在しないためremoveAFromABC、それへのポインターは無効になります。

于 2013-11-24T19:30:09.550 に答える