C 全局变量不能赋值两次
我在做TDD时遇到了一些问题。 我设计了这个功能:C 全局变量不能赋值两次,c,global-variables,memory-access,C,Global Variables,Memory Access,我在做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
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 *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;
}
当我第一次调用这个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
}
您可以使用以下代码行中的函数
getWordAndUpdate
修改对象oneLineString:
line->length--;
line->startIndex++;
所以,当你第二次调用它时,你的对象是不一致的
尝试复制oneLineString或查找不修改参数的算法
也许,您可以使用这种功能:
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 *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;
}
而且您还没有考虑delimiter参数。我认为您需要首先检查代码,并解决一些似乎存在的主要问题:1。函数
getWordAndUpdate
不使用分隔符
参数。。。2.您对该函数的第二次调用导致内存泄漏。。。3.您似乎没有在任何地方分配rawString
数组。。。可能还有一些问题。。。