【问题标题】:Strange Pointer behavior in while loopwhile循环中的奇怪指针行为
【发布时间】:2013-12-07 22:47:59
【问题描述】:

您好,我在哈希表中插入了一些值(实现的哈希表经过良好测试并且可以正常工作) 我用 fscanf 读入一个文件并将字符串的值和浮点数存储在变量中。

文本文件如下所示:

die 0.000000
laun -4.102468
des -7.952615
verliebt -6.080813
ein -8.645762
schaferspiel -4.315029
in -8.645762
vers -5.755391
und -8.645762
akt -3.909564
person -8.645762
egl -8.645762

读入是这样的:

//scan text for scheme WORDSTEM PROBABLITIY
r = fscanf(text, "%s %f\n", wordstem, &prob);
//doing some pointer madness!!!
pProb = &prob;
float PpProb = *pProb;
float *PPpProb = &PpProb;
char *cpStr = strdup(wordstem);
hashtable_access(wordHash, cpStr,PPpProb); //insert into hashtable_t
while (r != EOF){
    float prob1;
    r = fscanf(text, "%s %f\n", wordstem, &prob1);
    //printf("%f",prob1);
    char *cpStr1 = strdup(wordstem);
    float a = 0;
    float *PpProb1 = &a;
    float *pProb1 = &prob1;
    *PpProb1 = *pProb1;
    hashtable_access(wordHash, cpStr1,PpProb1);
    pProb1 = NULL;
    //do till EOF
}
float *pHashProb = (float *)hashtable_access(wordHash, "schaferspiel", NULL);
float hashProb = *pHashProb;
printf("%f\n",hashProb);

问题是哈希为第一个条目“死”返回正确的值,但 schaferspiel 和第一个之后的每个其他键总是返回最后一个值。

哈希表需要保存指针。我不确定我做错了什么,因为我认为我复制了 prob1 的值。

谁能帮帮我。

【问题讨论】:

    标签: c pointers hash while-loop memory-address


    【解决方案1】:

    您的代码存在一些问题(例如,我不明白为什么您在循环之前执行一个插入操作,而其余操作在循环中执行),但我认为主要问题是您使用的是相同的在哈希表中一遍又一遍地指向浮点数的指针。试试这样的:

    float prob;
    float *probCopy;
    
    //scan text for scheme WORDSTEM PROBABLITIY
    r = fscanf(text, "%s %f\n", wordstem, &prob);
    probCopy = (float*)malloc(sizeof(float));
    *probCopy = prob;
    char *cpStr = strdup(wordstem);
    hashtable_access(wordHash, cpStr, probCopy); //insert into hashtable_t
    while (r != EOF) {
        float prob1;
        r = fscanf(text, "%s %f\n", wordstem, &prob1);
        probCopy = (float*)malloc(sizeof(float));
        *probCopy = prob1;
        char *cpStr1 = strdup(wordstem);
        hashtable_access(wordHash, cpStr1, probCopy);
        //do till EOF
    }
    float *pHashProb = (float *)hashtable_access(wordHash, "schaferspiel", NULL);
    float hashProb = *pHashProb;
    printf("%f\n",hashProb);
    

    注意:您应该知道,您放入哈希表的所有内容都可能“泄漏”,除非哈希表清理了其元素指向的内存(或者您自己在其他地方明确地这样做了)。

    【讨论】:

    • 哇!这就像一个魅力!花几个小时来修复它!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多