【问题标题】:2D Array with malloc() error带有 malloc() 错误的二维数组
【发布时间】:2016-08-09 15:00:53
【问题描述】:

我正在尝试根据命令行参数在 c 中动态分配一个数组,但出现异常错误。我做错了什么?

int **array =(int**)malloc(Argument1);
for(a=0;a<Argument2;a++)
    array[a]=(int*)malloc(Argument2);

然后抛出异常:

__forceinline void * __cdecl _heap_alloc (size_t size)
{ 
 //stuff here
 return HeapAlloc(_crtheap, 0, size ? size : 1); }

我通过了一次 for 循环,然后在尝试读取数据时出现访问错误,但每隔一次它就会触发一个断点。我在 Visual Studio 中做错了什么?

【问题讨论】:

  • 那些 malloc 不可能是正确的。首先,不要在 C 中强制返回 malloc。其次,在您的循环中,您正在逐步分配越来越多的内存。第一次,1 个字节。下一次 2 个字节(总共 3 个),下一次 3 个字节,以此类推,直到达到 Argument 2 的值。
  • 你是对的,它们不正确,但我正在努力弄清楚它们为什么不起作用
  • 您没有显示进行访问的代码,但您说:“...尝试读取数据时出现访问错误...”
  • 我猜应该是array[a]=.. 而不是array[i],除非i 在您未发布的代码中被初始化和更新。
  • 抱歉,打错了

标签: c multidimensional-array dynamic malloc 2d


【解决方案1】:

malloc 函数的参数是以字节为单位的大小,而不是元素的数量,因为 malloc 无法知道每个元素的大小。 此外,循环应该循环通过 Argument1,而不是 Argument2。

试试这个:

int **array = malloc(arg1 * sizeof(int*));
for (int I = 0; I < arg1; I++) {
    array[I] = malloc(arg2 * sizeof(int));
}

【讨论】:

  • 我收到一个错误:“不能将“void *”类型的值分配给“int **”类型的实体
  • 另外,VS 在 (arg2 * int) 部分说“类型不允许”
  • @luvAtime41 第一次,我敢打赌你将代码编译为 C++,而不是 C,因为 C 中的 malloc 返回一个 void *,也就是通用指针,你不应该转换它。第二,对不起,这是我的错,我应该在那里输入 sizeof(int) 。 :)
  • @luvAtime41 建议你把文件扩展名改成“.c”再试一次。
  • @luvAtime41 "要强制编译器将所有文件都视为 C 而不管文件扩展名,请使用 /Tc 编译器选项。"(来自:msdn.microsoft.com/en-us/library/bb384838.aspx
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2019-01-26
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多