繁体   English   中英

while循环中的奇怪指针行为

[英]Strange Pointer behavior in while loop

您好,我向哈希表中插入了一些值(已对哈希表进行了很好的测试并可以正常工作),我使用fscanf读取了文件,并将字符串和float的值存储在变量中。

文本文件如下所示:

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

问题在于散列为第一个条目“ die”返回正确的值,但是在第一个返回后的schaferspiel和其他所有键始终返回最后一个值。

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

有人能帮帮我吗。

您的代码有一些问题(例如,我不明白为什么您要在循环之前执行一次插入操作,而其余要在循环中执行),但是我认为主要问题是您使用的指针指向相同的指针。在哈希表中反复浮动。 尝试这样的事情:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM