【问题标题】:Run time error in two dim array using pointers and malloc in C使用 C 中的指针和 malloc 在两个暗淡数组中运行时错误
【发布时间】:2014-04-24 21:21:10
【问题描述】:

我是 C 编程和学习指针以及使用指针实现二维数组的新手和新手。我在执行以下程序时遇到运行时错误,该程序编译时没有任何投诉,但在运行时崩溃并显示消息“分段错误(核心转储)”。如果我在不使用 malloc(用于动态内存分配)的情况下运行程序,它会完美运行。我在 Ubuntu linux 上使用 gcc 编译器。

#include<stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
main()
{
 int *arr[ROW];
 int i,j;
 arr[ROW] = (int *) malloc(COL * sizeof(int));  //dynamic memory allocation

 printf("\nEnter values\n\n");

 for(i=0;i<ROW;i++)
    {
     for(j=0;j<COL;j++)
         scanf("%d",(*(arr+i)+j));
     }


 printf("\nEntered values are\n");

 for(i=0;i<ROW;i++)
    {
      for(j=0;j<COL;j++)
          printf("\t%d",*(*(arr+i)+j));
          printf("\n");
     }
 printf("\n");
 }

程序在运行时崩溃并显示以下消息:

Segmentation fault (core dumped)

以下版本的程序(不带malloc)完美执行,没有任何错误

#include<stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
main()
{
int *arr[ROW][COL];
int i,j;

printf("\nEnter values\n\n");
for(i=0;i<ROW;i++)
   {
    for(j=0;j<COL;j++)
        scanf("%d",(*(arr+i)+j));
   }


 printf("\nEntered values are\n");

 for(i=0;i<ROW;i++)
    {
     for(j=0;j<COL;j++)
         printf("\t%d",*(*(arr+i)+j));
     printf("\n");
     }

 printf("\n");
 }

【问题讨论】:

  • 如果代码缩进良好,那就太好了。

标签: c arrays pointers segmentation-fault malloc


【解决方案1】:

在第一个代码中,您没有正确分配数组。这里你只分配矩阵的最后一行/列,你应该这样分配:

for(i=0; i<ROW; ++i)
     arr[i] = (int *) malloc(COL * sizeof(int));

顺便说一句,您应该知道,任何动态分配的东西都必须被解除分配。如果不是,您将遇到内存泄漏:

for(i=0; i<ROW; ++i)
     free( arr[i] );

【讨论】:

  • 只为一行分配内存真是太愚蠢了。我已经进行了更改,程序现在可以完美运行。非常感谢 :) 我是否应该在最后使用代码来释放内存。如果我最后不释放内存有什么问题......程序执行结束时内存不会自动释放
【解决方案2】:

你第一段代码的问题是这一行:

arr[ROW] = (int *) malloc(COL * sizeof(int));  //dynamic memory allocation

你到处都有undefined behaviour。首先,使用arr[ROW],您可以访问数组边界之外的内容。其次,如果要分配ROW的指针数量,则需要使用循环并存储在arr中。

for(i=0;i<ROW;i++)
arr[i]=malloc(COL * sizeof(int));

free()他们一旦你完成它和don't cast the return value of malloc()


您的第二个程序也不正确。指针数组根本没有初始化。它们的指针不指向有效的内存位置。您需要为 每个 指针分配内存,或者简单地使用适当的数组,例如:int arr[ROW][COL]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2019-10-08
    相关资源
    最近更新 更多