【问题标题】:Double Pointer being modified in an array mysteriously [closed]数组中的双指针被神秘地修改了[关闭]
【发布时间】:2017-04-10 00:20:52
【问题描述】:

您好,我有一个填充二维数组的函数,该数组由单词组成。我想简单地返回我输入函数的指针的值,但由于某种原因,指针现在指向别的东西,奇怪的是。我想知道如何解决这个问题。也不可能做指针算术来解决这个问题吗?(这不是我想要做的,我想看看问题是什么并以这种方式解决它,但无论如何很高兴知道)。所以它应该是一个 500 x 5 数组,即使我将字符串分配给 'dictPointer[i]',我认为它应该代表“*dictPointer”而不是“dictPointer”,但似乎我不应该有问题。我需要这样,因为我想打印从初始指针值开始的单词。另请注意,dictPointer 是指向指针的指针(**dictPointer)

char** readAndPopulateArray(FILE *f, char *fileName, char **dictPointer, int x ) { // x represents the number of words 
    // point is the word pointer
    int i = 0;
    char tempStr[80];
    char ch;
    f = fopen(fileName, "r");
    if ( f == NULL ) {
        printf("Cannot open %s. Verify it's in the right location\n", fileName);
    }

    while (fscanf(f, "%s", tempStr) == 1 ) {
        if( strlen(tempStr) == 4 ) {
            if(i == 0 ) {
                printf("Entering dictpointer points to %p\n", *dictPointer);
            }
            dictPointer[i] = tempStr;
                        if ( i == 499 ) {
                printf("Exiting dictPointer points to %p\n", *dictPointer);
            }
        }
        i++;
    }

    return dictPointer;
}

以下是我为矩阵调用 malloc 的方法:

char** makeStringWordArray(int x, int letters ) { // x represents number of words, function stores one character each per word
    // letters represents number of letters in each word
    char *hold;
    int i, j = 0;
    char **dict = (char **)(malloc(x * sizeof(char*)) );
    for (i = 0; i<x; i++ ) {
            dict[i] = (char*)(malloc(letters*sizeof(char) + 1 ) );
        }

    return dict;
}

【问题讨论】:

  • 这很不清楚 - 在第 0 次迭代中,您分配 dictPointer[0],这与 *dictPointer 相同。所以当然会改变!
  • 嗯,也许我仍然不明白这一切是如何运作的。 dictPointer 不是一直指向 dictPointer[0] ,除非我明确更改它吗?我的意思是这就是我想要的。现在如果它是 dictPointer[1] = 'string',如果 *dictPointer 指向 dictPointer[0] 会如何改变?
  • 没有二维数组。 char ** 不是二维数组,不能指向一个。为什么不使用二维数组?哦,一般情况下不要投射malloc & friends 或void * 的结果。
  • 因为赋值需要我使用动态分配的数组,你指的是哪一行?为什么不呢?
  • 好的,这一切都说得通。非常感谢,哇,我不敢相信有书应该教我们垃圾;这太疯狂了。

标签: c string malloc


【解决方案1】:

您将每个dictPointer[i] 分配给同一个指针tempStr。那么tempStr的生命周期在readAndPopulateArray的末尾结束,使得dictPointer[i]无效。

也许你的意思

strcpy(dictPointer[i], tempStr);

【讨论】:

  • 抱歉,我还是不太明白。 tempStr 每次都在变化,我也是。每次迭代都不像 dictPointer[0] = tempStr 。那么您是说循环结束时每个 dictPointer[i] 都指向 dictPointer[499] 还是其他?
  • 循环结束时,dictPointer 是一个包含 500 个 &amp;tempStr[0] 副本的数组。当函数结束时,它是一个包含 500 个无效指针的数组。
  • OHHH 现在我明白了,谢谢。