首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个全局变量不能赋值两次

一个全局变量不能赋值两次
EN

Stack Overflow用户
提问于 2014-03-13 22:19:22
回答 1查看 58关注 0票数 0

我在做TDD时遇到了一些问题。我设计了这个函数:

代码语言:javascript
复制
String *subString;

String *getWordAndUpdate(String *line, char *delimiter) {
    String *word = malloc(sizeof(String));
    int i;

    stringLeftTrim(line);

    word->length = 0;
    word->startIndex = 0;

    for(i = line->startIndex; i < line->length; i++) {
        if(line->rawString[i] != ' ') {
            word->rawString[i] = line->rawString[i];
            line->startIndex++;
            word->length++;
        } else {
            break;
        }
    }

    line->length = line->length - i;

    return word;
}

使用我的String struct:

代码语言:javascript
复制
typedef struct {
    char *rawString;
    int startIndex;
    int length;
} String;

当我第一次调用这个getWordAndUpdate函数时,它工作得很好,但当我第二次调用时,它显示内存访问不佳。

代码语言:javascript
复制
extern String *subString;
void test_getWordAndUpdate_should_get_the_first_word_from_a_line_of_instruction() {
    String oneLineString = {"movwf 0x10", 0, 10};

    subString = getWordAndUpdate(&oneLineString, " ,;"); // works fine

    TEST_ASSERT_EQUAL('m', subString->rawString[0]);
    TEST_ASSERT_EQUAL('o', subString->rawString[1]);
    TEST_ASSERT_EQUAL('v', subString->rawString[2]);
    TEST_ASSERT_EQUAL('w', subString->rawString[3]);
    TEST_ASSERT_EQUAL('f', subString->rawString[4]);
    TEST_ASSERT_NOT_EQUAL(' ', subString->rawString[5]);
    TEST_ASSERT_NOT_EQUAL('0', subString->rawString[6]);
    TEST_ASSERT_NOT_EQUAL('x', subString->rawString[7]);
    TEST_ASSERT_NOT_EQUAL('1', subString->rawString[8]);
    TEST_ASSERT_NOT_EQUAL('0', subString->rawString[9]);

    TEST_ASSERT_EQUAL(5, oneLineString.startIndex);
    TEST_ASSERT_EQUAL(5, oneLineString.length);
    TEST_ASSERT_EQUAL(0, subString->startIndex);
    TEST_ASSERT_EQUAL(5, subString->length);

    subString = getWordAndUpdate(&oneLineString, " ,;"); // bad memory access
}
EN

回答 1

Stack Overflow用户

发布于 2014-03-13 22:26:11

您可以在以下代码行中使用getWordAndUpdate函数修改对象oneLineString:

代码语言:javascript
复制
line->length--;
line->startIndex++;

所以,当你第二次调用它时,你的对象是不一致的。

尝试制作oneLineString的副本或找到不修改参数的算法。

也许,你可以使用这样的函数:

代码语言:javascript
复制
String *subString;

String *getWordAndUpdate(String *line, char *delimiter) {
    String *word = malloc(sizeof(String));

    int i;
    for (i = 0; line->rawString[i] != ' '; ++i)
        word->rawString[i] = line->rawString[i];
    word->length = i;

    return word;
}

你还没有注意到你的分隔符参数。

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

https://stackoverflow.com/questions/22381458

复制
相关文章

相似问题

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