【问题标题】:realloc pointer change when out of functionrealloc 指针在功能失效时更改
【发布时间】:2013-06-26 08:59:46
【问题描述】:

我开始做关于动态数组的作业,首先,我有一个二维数组:

int initializeInfo[3][4] ={{77,68,0,0},{96,87,89,78},{70,90,86,0}};

并使用指针来存储它:

int **ptr = (int**)malloc(3*sizeof(int));
int size = 0;
for(int i =0;i<3;i++){
    addInitiazeInfo(ptr,initializeInfo[i],size);
}

这里是函数 addInitiazeInfo:

void addInitiazeInfo(int**& ptr, int arr[],int& size){
    ptr[size] = (int*)malloc(4*sizeof(int));
    if(ptr[size] == NULL){
        return;
    }
    ptr[size] = arr;
    size++;
}

运行正常!二维数组由ptr指针存储。

我想添加新行,我认为需要 realloc,然后我尝试:

int arr[] = {3,4,5,6};
size++;            
ptr = (int**)realloc(ptr,size * sizeof( int ) );
ptr[size-1] = (int*)malloc(4*sizeof(int));
ptr[size-1] = arr;

但我认为这是我的麻烦,输出让我很难知道它是如何发生的:

请帮帮我,谢谢大家

【问题讨论】:

  • 我认为你没有意识到 ptr[size] = arr; 在做什么
  • int **ptr = (int**)malloc(3*sizeof(int)); 是错误的(realloc 也是如此))。顺便说一句:C 没有引用。也许你的意思是 C++?
  • 谢谢wildplasser,你能告诉我更多关于我的问题吗?我根据我的教学大纲编码。没有人教我这个问题
  • 标记一个 realloc/malloc 问题 C++ 让我,嗯,sigh
  • ptr 的定义类型是int **ptr;,所以它指向一个指针,(或指针数组的第一个成员)所以,你应该为它分配3 * sizeof (int*) 字符。并且:混合 C 和 C++ 真的 是一个坏习惯。

标签: c++ arrays realloc


【解决方案1】:

当你这样做时

ptr[size] = arr;

您实际上是将arr 的地址分配给ptr[size]。这意味着你刚刚分配的内存丢失并成功泄漏。

您想逐个元素手动复制或使用memcpy 之类的东西。这可能会解决您的问题,具体取决于您的其余代码。

【讨论】:

  • 谢谢你的理想,我通过使用二维数组或结构(不使用指针)完成了这项作业,但我想提高我的技能,所以我把自己带到更难的事情上(它是我的意见),我会注意你的理想。所以你可以告诉我更多关于我的问题,那就是我不知道为什么我的指针不能使用 realloc 添加新数组。卡卡
  • @fukemyfukemy 查看stackoverflow.com/questions/8287109/… 了解如何复制数组的详细信息,这正是您想要做的。你能告诉我这是否能解决问题吗?我认为我们需要查看更多您的代码以了解它失败的原因
  • 好的,我正在阅读这个页面,这是完整的代码,我很抱歉忘记评论一些代码 T^T。 mediafire.com/download/jyd997ku1tt676d/myCode.txt
  • @fukemyfukemy 是的,正如我猜测的那样,您的新数组在函数内,因此一旦您离开该函数,指针就无效,因此您会得到垃圾(官方未定义的行为)。您应该修复您的代码以按照我的链接进行复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多