我的任务是从文本文件中读取单词并将它们存储在存储在char*
数组中的字符数组中。这些数组中的所有内存都需要动态分配。
我正在做的是用fscanf()
读取每个单词并将其存储到变量str
中。然后我计算str
中单词的长度并动态分配内存以在{1}}中存储str
的值。然后将new_word
插入名为new_word
的{{1}}数组中。当char*
空间不足时,我将其尺寸加倍并继续。
我的问题在于从第62行开始的注释代码。我将需要稍后从words
读取这些单词,因此我正在测试我访问指针及其值的能力。我可以将words
编入索引(在上面的行中),但是当我在words
中存储new_word
并尝试从new_word
读取时,我收到以下错误:< / p>
words
。我知道它与取消引用指针有关,但我尝试了一堆变化而没有成功。我该如何解决这个问题?
以下是代码:
words
答案 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]);
......比循环更简单。