【问题标题】:Realloc makes my program crash [closed]Realloc 使我的程序崩溃 [关闭]
【发布时间】:2016-03-18 11:11:20
【问题描述】:

我需要重新分配一个 char 矩阵,但它不起作用。

我尝试了很多解决方案,但没有一个有效。

程序可以编译,但运行后它在 realloc() 上崩溃。

#include <stdio.h>
#include <stdlib.h>

typedef struct Xy {
  int x;
  int y;
}Xy;

typedef struct Nodo{
  Xy destination;
  struct Nodo *next;
}Nodo;

char **matrD;
char **matrU;
char **matr;

int i,j;

Nodo *header;

Xy pos;
Xy dimD;
Xy dimU;
Xy startD;
Xy startU;
Xy *dim;
Xy *start;
char flor='d';

int *dimen;
int dimenD[]={10,6};
int dimenU[]={10,6};
int gradi=0;
char sens[4];

void addCol(){
    int newsize=dim->x+2;
  for(i=0;i<dim->y;i++){
    printf("ciao\n");
    printf("%d",newsize);
    printf("%c\n",matr[i]);
    matr[i]=realloc(matr[i],sizeof(char)*newsize); <-----it crash here
    printf("ciao\n");
  }
  dim->x=dim->x+2;
}



void addRow(){
  dim->y=dim->y+2;
 // matr= (char*)realloc(matr,dim->y);
}

void loop() {

  addCol();
 // stampamatrix();
}

void main() {

  sens[0]='t';

  startD.x=0;
  startD.y=0;
  startU.x=0;
  startU.y=0;
  pos.x=0;
  pos.y=0;
  dimD.x=1;
  dimD.y=1;
  dimU.x=0;
  dimU.y=1;
  dim=&dimD;
  dimen=dimenD;
  start=&startD;
  matrD =malloc(sizeof(char*)*dimD.x);
  matrD[0] =malloc(sizeof(char)*dimD.x);
  matrU =malloc(sizeof(char*)*dimU.y);
  matrU[0] =malloc(sizeof(char)*dimU.x);


  loop();

}    

【问题讨论】:

  • “如果没有帮助,请阅读手册。”我建议阅读realloc的描述。
  • 首先,不要重新分配给您在调用realloc 时使用的同一个指针。如果realloc 失败,它将返回NULL,您将丢失原始指针(否则仍将指向有效分配的内存)。其次,所有的全局变量是怎么回事?他们真的都需要全球化吗?你知道你可以将参数传递给你自己的函数吗?
  • 您的代码中还有其他或多或少严重的问题,首先引起我注意的是这个调用printf("%c\n",matr[i])。这里matr[i] 是一个指针,而不是一个字符。使用"%p" 打印指针。
  • 除了 Joachim Pileborg 的评论:在 printf("%c\n",matr[i]); 中,您在初始化之前使用 matr[i]。换句话说,在第一次调用addCol 时,matr 为 NULL。
  • 为什么所有这些指针?例如有什么用dim 还是 start?为什么不直接访问dimDstartD

标签: c realloc


【解决方案1】:

问题是您没有在任何地方初始化 matr,这意味着它是一个空指针(因为它是一个全局变量,所以它是“零初始化”的,这意味着 NULL 用于指针)。

因此,当您尝试使用例如取消引用 matr matr[i] 那么您将有未定义的行为并且很可能会崩溃。

您应该学习如何使用调试器,因为那样这个问题就会非常明显。当崩溃发生时,在调试器中运行会使调试器在崩溃位置停止。然后它将允许您向上走函数调用堆栈,以便您可以访问您的代码(如果调试器尚未在您的代码处停止),然后您可以检查相关参数的值。在调试器中检查matr[i] 会导致调试器告诉您它不是一个有效的指针,并且您很快就会发现这个问题而无需任何帮助。

【讨论】:

  • 不确定这是唯一的问题。
【解决方案2】:

您没有为matr 分配内存,因此尝试访问matr[i] 会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2015-06-28
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多