调试器向指针显示错误的值

时间:2015-09-15 20:04:52

标签: c debugging

我有以下代码:

#include <iostream>
#include <cstdio>
#include <list>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <limits>
#include <functional>
#include <algorithm>
#include <cmath>
#include <string>
#include <ostream>
#include <sstream>
#include <bitset>
#include <numeric>
#include<fstream>



using namespace std;

char str[] = "this.is.a.test";
char str2[] = "this.is.another.test";

typedef struct
{
    size_t count;
    char** strings;
} Tokens;

Tokens Tokenize(char* String, char Split)
{
    Tokens t;
    t.count = 1;

    for (size_t i = 0; String[i] != 0; i++)
    {
        if (String[i] == Split)
            t.count++;
    }

    t.strings =(char**) malloc(sizeof(char*)* t.count);

    if (t.count > 0)
        t.strings[0] = String;

    for (size_t i = 0, j = 1; String[i] != 0; i++)
    {
        if (String[i] == Split)
        {
            t.strings[j] = &String[i + 1];
            String[i] = 0;
            j++;

        }
    }


    return t;
}

int main(void)
{
    Tokens t = Tokenize(str, '.');
    printf("number of strings: %i\n---\n", t.count);
    for (size_t i = 0; i < t.count; i++)
    {
        printf("%i: %s\n", i, t.strings[i]);
    }
    free(t.strings);

}

问题出在我调试代码时,特别是那行t.strings[j] = &String[i + 1];

在this.is.a.test的测试案例中

在第一个找到的点。 ,它应指向此,但在调试器中它显示以下图片。 enter image description here     在这里输入代码

1 个答案:

答案 0 :(得分:0)

调试器显示的内容在第55行是正确的。已完成分配,因此t.strings[j]指向点后面。

请注意,在Tokenize中,您在堆栈上分配Tokens t;,然后返回此t。这很糟糕(非常糟糕!)。由于t位于堆栈中,因此调用printf会覆盖它。

(虽然大多数是C,但正如C中的C ++,你不能在for初始化中声明变量,如for (size_t i = 0;