这是我在尝试理解malloc和指针如何工作时所做的一小段代码。
#include <stdio.h>
#include <stdlib.h>
int *buffer (int count)
{
int *buffer = malloc (count * sizeof(int));
for (int i = 0; 0 <= i && i < count; i++)
{
buffer[i] = 0;
}
return &buffer;
}
int main ()
{
int size = 0;
int i = 0;
scanf ("%d", &size);
int *num = buffer (size);
while (i < size)
{
scanf ("%d", &num[i]);
i++;
}
}
由于某些我无法理解的原因,我不断遇到分段错误。这个错误在最后一次scanf()上重复发生,我不知道为什么。我知道我必须将指针传递给扫描f而num已经是指针所以我认为我不需要包含&amp ;.但是,如果我不这样做,我会更早收到分段错误。另外,我相信我已经使用malloc分配了正确的空间,但我不确定。任何有关这里发生的事情的帮助将不胜感激。
答案 0 :(得分:3)
您返回了指向局部变量buffer
的指针,这将取消退出函数buffer
。
您应该删除&
语句中使用的return
并将指针返回到已分配的缓冲区。
还应添加检查malloc()
是否成功。
答案 1 :(得分:2)
我可以看到一些问题,其中一个肯定是个问题。
在功能中,int *buffer (int count)
return &buffer;
这将返回buffer
的地址,该地址已经是本地 int *
变量。
因此,当返回发生时,变量buffer
将不再有效。因此,地址无效。
截至目前,其中一种方法是避免使用函数调用buffer
并使用calloc()
。
因为,calloc()
将根据可用性分配所请求长度的内存,默认情况下将初始化为0。
或者,另一种方法是将buffer
指针作为全局变量。
此外,对于现有的实现,需要一段代码来检查malloc
是否返回任何内容。这表明内存是否已分配。
这样的事情可以做到:
int *buffer = malloc (count * sizeof(int));
if(buffer == NULL)
{
// Some error handling
return 0;
}
此外,我看到for
循环看起来有点像它看起来有点奇怪:
for (int i = 0; 0 <= i && i < count; i++)
我认为你试图循环count
次并在缓冲区填充0。这可以通过
for (int i = 0; i < count; i++)
因此,malloc()
后面是错误检查,然后是for
,用零填充分配的内存。因此,使用calloc
可以让生活变得更轻松。
重要的是,你分配了内存,但似乎没有一个代码可以解除分配(释放)它。有很多例子可以参考。我建议你阅读Memory Leakage,Dangling Pointers等概念,并使用valgrind或类似的东西来验证内存使用情况。
作为旁注而非经验法则,请始终确保用于变量的名称与用于函数的名称不同。这造成了很多混乱。继续使用现有的命名习惯,您将在审核代码时度过艰难的一天。