Arrays 在C中向动态数组添加整数,内存问题

Arrays 在C中向动态数组添加整数,内存问题,arrays,c,pointers,memory,dynamic,Arrays,C,Pointers,Memory,Dynamic,我在向动态数组读取器添加整数时遇到问题,因此下面代码中的第二个函数。为什么输出中添加的数字看起来很奇怪?我猜这是内存问题,我不知道怎么分配了新内存 int*创建动态数组(无符号整数) { int*array=malloc(n*sizeof(*array)); 对于(大小i=0;i0){ *ptr=newval; ptr++; j--; } ptr=测试阵列; while(*ptr){ *arr++=*ptr++; } 返回新数组; } void printary(常量int*数组,int大小)

我在向动态数组读取器添加整数时遇到问题,因此下面代码中的第二个函数。为什么输出中添加的数字看起来很奇怪?我猜这是内存问题,我不知道怎么分配了新内存

int*创建动态数组(无符号整数)
{
int*array=malloc(n*sizeof(*array));
对于(大小i=0;i0){
*ptr=newval;
ptr++;
j--;
}
ptr=测试阵列;
while(*ptr){
*arr++=*ptr++;
}
返回新数组;
}
void printary(常量int*数组,int大小){
printf(“{”);
对于(int i=0;i

realloc逻辑有什么问题?

realloc就是这样工作的:

新对象的内容应与解除分配前的旧对象的内容相同,以新旧尺寸中较小者为准

无需手动复制任何内容。整个功能可以简化为:

int *add_dyn_array(int *arr, unsigned int num, int newval)
{
  int *temp = realloc(arr, (num + 1)*sizeof(int));
  if(temp == NULL)
  { 
    /* optionally handle errors in some way */
    exit(EXIT_FAILURE);
  }
  temp[num] = newval;

  return temp;
}

但是,请注意,一次重新分配一个项目的效率非常低。

这就是realloc的工作原理:

新对象的内容应与解除分配前的旧对象的内容相同,以新旧尺寸中较小者为准

无需手动复制任何内容。整个功能可以简化为:

int *add_dyn_array(int *arr, unsigned int num, int newval)
{
  int *temp = realloc(arr, (num + 1)*sizeof(int));
  if(temp == NULL)
  { 
    /* optionally handle errors in some way */
    exit(EXIT_FAILURE);
  }
  temp[num] = newval;

  return temp;
}

但是请注意,一次只重新分配一个项目是非常低效的。

这个仪式应该做什么?add应该是realloc(…);temp[num]=newval;返回温度,不需要更多。也就是说,如果您试图将
newval
添加到数组的末尾。如果你想添加多个元素并用newval填充它们,你需要知道以前的大小和新的大小。您不能假设realloc添加的额外元素最初具有任何特定值。请不要添加文本图片。将它作为文本添加到你的问题中。这个仪式应该做什么?add应该是realloc(…);temp[num]=newval;返回温度,不需要更多。也就是说,如果您试图将
newval
添加到数组的末尾。如果你想添加多个元素并用newval填充它们,你需要知道以前的大小和新的大小。您不能假设realloc添加的额外元素最初具有任何特定值。请不要添加文本图片。将其作为文本添加到问题中。效率取决于实施。在我的GNU/Linux x84-64系统上,从1到1000000的简单循环将同一个块重新分配到循环索引计数器指定的长度,只会将返回的指针更改20次。@IanAbbott确定,但抱最好的希望,做好最坏的准备。@IanAbbott是否也写入内存?如果没有,那么操作系统可能会优化实际分配,并在实际需要内存之前避免这样做。@Lundin I忽略了写入内存,但在稍微调整后,在realloc之后写入块的最后一个字节,块被重新分配的次数没有变化(虽然有时重新分配20次,有时重新分配24次)。谢谢你的帮助。下次我只删除3/4的代码,也许它马上就能工作,呵呵。效率取决于实现。在我的GNU/Linux x84-64系统上,一个从1到1000000的简单循环将同一个块重新分配到循环索引计数器指定的长度只会将返回的指针更改20次。@IanAbbott当然,但抱最好的希望,做最坏的打算。@IanAbbott你也写了内存吗?如果没有,那么操作系统可能会优化实际分配,并在实际需要内存之前避免这样做。@Lundin我忽略了写内存,但在稍微调整后,在realloc,t之后写入块的最后一个字节这里没有更改块被重新分配的次数(虽然有时它被重新分配20次,有时它被重新分配24次)。谢谢你的帮助。下次我只删除代码的3/4,也许它马上就可以工作了,呵呵。