动态分配的内存中指针的访问值

时间:2015-09-08 19:23:55

标签: c arrays pointers

我的任务是从文本文件中读取单词并将它们存储在存储在char*数组中的字符数组中。这些数组中的所有内存都需要动态分配。

我正在做的是用fscanf()读取每个单词并将其存储到变量str中。然后我计算str中单词的长度并动态分配内存以在{1}}中存储str的值。然后将new_word插入名为new_word的{​​{1}}数组中。当char*空间不足时,我将其尺寸加倍并继续。

我的问题在于从第62行开始的注释代码。我将需要稍后从words读取这些单词,因此我正在测试我访问指针及其值的能力。我可以将words编入索引(在上面的行中),但是当我在words中存储new_word并尝试从new_word读取时,我收到以下错误:< / p>

words

第63行和第64行的

。我知道它与取消引用指针有关,但我尝试了一堆变化而没有成功。我该如何解决这个问题?

以下是代码:

words

1 个答案:

答案 0 :(得分:1)

指向“{动态分配的char*数组”的指针需要记录在char **类型的变量中。也就是说,指向数组第一个元素的指针,该元素的类型为char *。因此...

char **words;

如果您想为size字提供足够的空间,那么您可以将其分配为...

words = calloc(size, sizeof(char *));

(请注意与您的代码的不同之处),尽管使用此表单会出错:

words = calloc(size, sizeof(*words));

请注意,sizeof运算符不会计算其操作数,因此words尚未分配。

最重要的是,要注意数组words的元素本身是指针,而不是最终指向的字符串。因此,您可以通过

为数组指定一个新单词
words[count] = new_word;

(同样,请注意与您的版本的不同之处。)还需要进行其他调整。

有问题的while循环,即使在那时也没有修复。请注意,表达式pointer[index]等同于*((pointer) + (index)),因此表达式*(words[count])[k]会尝试三次 derference words。即使进行了类型修正,您也只想对其进行双重解除引用:words[count][k]

但为什么要重新发明轮子呢?正如Olaf关于strlen()以及您之前的一些代码所观察到的那样,C已经在其标准库中具有非常好的函数来处理字符串。在这种情况下......

printf("%s", words[count]);

......比循环更简单。