2014-03-13 99 views
0

我在做TDD时遇到了一些问题。 我设计了这个功能:全局变量不能分配两次

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; 
} 

随着我的字符串结构:

typedef struct { 
    char *rawString; 
    int startIndex; 
    int length; 
} String; 

当我把这个getWordAndUpdate功能第一次它工作正常,但是当我称之为第二次它说坏的内存访问。

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 
} 
+1

我认为你需要首先检查你的代码,并修复看起来有些主要问题:1.函数getWordAndUpdate不使用'delimiter'参数。2.你第二次调用这个函数导致内存泄漏... 3.您似乎没有在任何地方分配'rawString'数组......并且可能还有其他几个问题...... –

回答

1

你发挥getWordAndUpdate修改的代码行的论文你的对象oneLineString:

line->length--; 
line->startIndex++; 

所以,当你把它称为第二次,在不一致的对象。

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

也许,你可以使用这种功能:

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; 
} 

你不照顾还没有您的分隔符参数。