malloc在C语言中导致分割错误

4

我正在设置一个指向指针的指针,就像上面的代码一样。问题在于,malloc总是会抛出分段错误,无论我尝试了什么。这是代码:

wchar_t **Words ;
int lc = lineCounter() ;
**Words = malloc( lc * sizeof(int)  ) ;
if (**Words == NULL) return -1 ;

lineCounter函数只是一个返回文件中行数的函数。

我试图做的是释放一些内存,这些内存用于保存指向lc个单词的指针。

以下是我想法的可视化表现:

enter image description here


2
Words 指向什么? - Oliver Charlesworth
如果我理解你的问题,那么将其转换为字符数组。 - billpcs
4
你正在解除引用Words,但是Words具有不确定值。 - ouah
你的问题标题有误导性。malloc 和此无关;你可以说 *Words = giraffe(),但仍会出现相同的错误。你的问题实际原因是 解除引用存储在未初始化变量中的指针值 - Eric Lippert
@EricLippert 我会在标题中保留 "malloc" .. 这篇文章的目标是正确使用 malloc(他甚至有正确的心理模型来解释它应该如何工作) - M.M
显示剩余4条评论
2个回答

8
让我逐行解释你的代码:
wchar_t **Words ;

它创建了一个指向wchar_t类型的指针的指针。问题在于,在创建时,它指向内存中的随机区域,因此可能不属于你。

*Words = malloc( lc * sizeof(int)  ) ;

这一行代码取消指针引用并修改其内容。你试图修改一个不属于你的内存区域。

我认为你想做的是:

wchar_t **Words ;
int lc = lineCounter() ;
Words = malloc( lc * sizeof(wchar_t *)  ) ;
if (Words == NULL) return -1 ;

然后在数组中为所有维度分配内存。

编辑:

你可能想按照你的方案做一些类似的事情:

wchar_t **Words ;
int i = 0;

int lc = lineCounter() ;
Words = malloc( lc * sizeof(wchar_t *)  ) ;
if (Words == NULL) return -1 ;
while (i < lc)
{
  Words[i] = malloc(size_of_a_line * sizeof(wchar_t));
  if (words[i] == NULL) return -1;
  ++i;
}

这会做我在Dropbox文件中展示的内容吗?因为我觉得很奇怪。 - billpcs
*Words[i] 应该是 Words[i] - alk
好的,没问题。我的错。 :) - Michel Antoine

3

指针是一个存储位置的引用。变量就是存储位置的一个例子。

符号*取一个指针并给出指针所引用的存储位置。

words是一个指针,它引用wchar_t类型的存储位置。由于它没有初始化,因此不确定它引用哪个存储位置。

应用*运算符会产生指针所引用的位置;由于您没有指定引用的位置,因此写入该位置可能会导致任何行为, 包括崩溃。

在将某物赋值给*words之前,需要让指针words引用某个位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接