c - c中的内存重新分配

标签 c dynamic-memory-allocation

<分区>

我是新手,对 c 编程非常感兴趣,现在我正在编写一个用于动态内存分配的 c 程序。

这些是程序的阶段:

  1. 它从用户那里得到 n 个数字
  2. 它打印它们
  3. 它从用户那里得到另外 n 个数字
  4. 它打印两组数字

我的程序适用于较小的 n 值,但不适用于较大的值,例如 200000 个数字。即首先我输入了 100000 个数字,然后我输入了另一个 100000 个数字。

它对第一组执行得很好,但随后出现段错误。我使用 gdb 进行调试。它显示 SIGSEGV 错误。

任何人都可以解释发生了什么并给我一个解决方案吗?

#include<stdio.h>
#include<malloc.h>
int main(void)
{

    unsigned int *p=NULL;
    unsigned int n;
    unsigned int i;
    unsigned int *a;
    unsigned int *t;
    unsigned int k=0;

    printf("Enter no.of elements...");
    scanf("%d", &n);

    p = (unsigned int*)malloc(n*sizeof(unsigned int));
    a = p;
    t = p;
    for (i=0; i<n; i++, *p++, k++) {
        scanf("%d",p);
    }

    for(i=0;i<n;i++,a++) {
        printf("Element No-%d %d Address->%d\n", i, *a, a);
    }

    a=t;

    printf("next time...how many elements do you enter");
    scanf("%d",&n);

    t=p;
    a = (unsigned int*)realloc((void *)a, n*sizeof(int));
    for (i=0; i<n; i++, *t++ ,k++) {
        scanf("%d",t);
    }

    printf("next time...printing..\n");

    for (i=0; i<k; i++, a++) {
        printf("Element No-%d %d Address->%d\n",i,*a,a);
    }

    free(p);
    free(a);


}

最佳答案

realloc 更改分配的大小,它不会按您指定的大小增加分配。

所以你需要做

a=realloc(a, original_size + extent_size);

( You don't need to cast the return value of malloc or realloc in C. )

另一个注意事项:

t=p;
...
a=t;
...
t=p;
a=realloc(...);

您不能在 realloc 之后使用 t,因为 realloc 可能会更改 block 的地址。将 t=a; 放在 realloc 之后。 (并使用更具描述性的名称,您的代码很难理解。)

关于c - c中的内存重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329432/

相关文章:

c - 我需要正确读取行尾。空白区域问题

c - C 中使用信号量的多线程生产者和消费者

c++ - 大型 const 数组的初始化?

arrays - 如何比较 C 中由 strdup() 创建的两个字符串数组?

C 内存分配、结构数组中的段错误/双重释放

java - Java 8 与 Java 9 之间的内存分配是否存在差异?

c++ - std::string 的默认容量?

c++ - 使用结构中的变量定义数组大小

c++ - 如何获取指向动态分配对象的指针的基地址

c - 如何调整CRC32与CRC16的调节因子计算?