在运行时使用'realloc()'会导致崩溃,为什么?-C语言

Emirhan G.

我有一个要在运行时增加大小的数组。我通过使用循环将值分配给数组的元素,当循环的索引达到数组的元素数时,我想增加数组的大小。

我所做的实际上有效;我可以为数组的元素分配值,而通常情况下,如果不增加数组的大小,我将无法为其分配任何值。不好的一面是,程序运行顺利完成后,它使我崩溃了。怎么了 是否可能是我尝试分配给该数组的内存已满?

int main()
{
    int arr[3];
    int num_of_elements = sizeof(arr)/sizeof(arr[0]); // This gives '3', I checked

    for(i = 0; i < 10; i++)
    {  
        if(i == num_of_elements)
        {
            num_of_elements = num_of_elements + 10;
            realloc(arr, num_of_elements);
        }
        arr[i] = i+10;
        printf("%d\n", arr[i]);
    }

    return 0;
}
用户名

好吧,您正在调用未定义的行为。根据标准§7.22.3.5

void *realloc(void *ptr, size_t size);

如果ptr是空指针,则realloc函数的行为类似于malloc指定大小函数。否则,如果ptr与内存管理函数先前返回的指针不匹配,或者如果通过调用free或reallocfunction释放了空间,则该行为是不确定的。如果无法分配用于新对象的内存,则不会释放旧对象,并且其值不变。

通过内存管理功能-意味着mallocarr不是动态分配的内存。因此,将其传递给realloc未定义的行为-在这种情况下,该行为会导致您在程序中崩溃。

如果这样做,那会起作用

int *arr = malloc(sizeof(int)*3);
if( arr == NULL){
  perror("Malloc failed");
  exit(EXIT_FAILURE);
}

...
int *p = realloc(arr,num_of_elements*sizeof(int));
                       ^^^^^
if(p == NULL ){
   perror("realloc failed");
   exit(EXIT_FAILURE);
}
arr = p;

检查如何realloc使用。

外卖将是:

  • 检查的返回值reallocmalloc
  • 您试图重新分配需要10*sizeof(int)内存的额外10个元素
  • arr = realloc(arr,SIZE)万一realloc失败,请不要做否则会导致内存泄漏。

为什么reallocp毕竟你做arr=pannyway?

到目前为止有两个原因

  • 答案是realloc失败时返回,NULL如果您分配arr它,则返回现在NULL那么您可能会遇到丢失对先前分配的内存的唯一引用的情况,从而导致内存泄漏。这就是我们这样做的原因。

  • 从标准上注意这一点

realloc函数返回指向新对象的指针(可能与指向旧对象的指针的值相同),或者如果无法分配新对象,则返回null指针

请注意,该may部分-可能与之前指出的地址相同,arr也可能不同。这就解释了为什么我们应该将其存储在一些临时指针中,然后再进行分配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有什么方法可以在运行时使用C或C ++编译其他代码吗?

为什么对字典使用隐式集合初始化器会导致C#中的运行时错误?

C ++,成员线程对象在运行时会导致结构删除崩溃

使用SwiftGen在运行时更改语言

为什么这个简单的strcat在运行时崩溃?

为什么此C程序在运行时引发分段错误?

为什么C中的realloc()会更改内存?

在运行时C ++中使用派生类

在运行时使用Gcc导入C ++成员函数

对于汇编/C 中的变量,为什么要使用 .data 而不是在 .bss 中保留空间并在运行时初始化?

一副纸牌程序编译但在运行时崩溃 (c++)

C ++映射值在运行时未更改,我在做什么错?

有什么方法可以在运行时编译C ++代码?

递归函数在运行时崩溃

C - 在结构内的指针上使用 Realloc 时崩溃

使用realloc时程序崩溃

尝试在运行时使用反射更改属性的值会导致NullPointerException

为什么C ++允许在运行时将数组大小传递给函数以构造固定大小的数组?

如何在运行时使用Appcelerator更改语言应用

Angular:使用AOT时如何在运行时获取当前语言环境

解释型语言在运行时是否使用符号表?

无法在运行时使用会话更改语言ASP.NET

为什么将C字符串作为char *传递给函数会导致运行时错误(但将定义为char []的C字符串传递是可以的)?

使用Circe Json,为什么隐式分辨率在运行时会变慢

为什么在运行时找不到我的项目引用/使用的DLL?

Kotlin语言在运行时获取类

在运行时更改语言环境不会影响片段

Android语言环境在运行时未(完全)更改

在运行时更改应用程序语言