阵列相关问题

时间:2010-06-13 15:10:11

标签: c arrays

我有以下程序:

int insert(int *array, int arraySize, int newElement)
{
   array[arraySize + 1] = newElement;
   return (arraySize+1);     // Return new Array size......
}
int main()
{
   int array[] = {1,2,3,4,5};
   int arraySize = sizeof(array) / sizeof(int);

   insertInArray(array, arraySize,6);
   print(array);
}

我正在尝试用C编写这个程序,但是当我在插入后打印数组时,它不会打印所需的输出。

如果我做错了,请纠正我。

更新代码:

int insert(int **array, int arraySize, int newElement)
{
   int i;    
   *array = realloc(*array,++arraySize * sizeof(int));    
   (*array)[arraySize] = newElement;    
   return (arraySize);
}

int main()
{
   int i;
   int arraySize = 5;
   int *array = (int *)malloc(arraySize * sizeof(int));
   for(i=1; i<=arraySize; i++)
      array[i] = i;

   printArray(array, arraySize);
   arraySize = insert(&array, arraySize,6);
   printArray(array, arraySize);
}

2 个答案:

答案 0 :(得分:3)

你不能像这样扩展C数组的大小;在这方面它不是动态的;一点也不。您必须显式重新分配内存。由于存储器可以在C中以两种方式分配:堆栈(函数中的局部变量)和堆(调用malloc),因此情况更加复杂。 (实际上我猜它是三种方式,如果你包括全局/静态。)

因此有两件事需要改变:

  1. 如果您只想使用简单数组,而不是包含数组和某些大小指示的结构,那么“插入”函数将必须分配新内存并将旧数组值复制到其中
  2. 应该从堆中分配要由该函数操作的数组。

答案 1 :(得分:2)

首先,这将导致缓冲区溢出(两个):

您已为5个整数分配了空间(最后一个索引4)。然后:

array[arraySize + 1] = newElement;

写入索引6,它是 2 超过数组的末尾。如果要更改数组的大小,则需要使用realloc。,并且您的函数需要不同的签名,以便它可以修改指针。像(省略错误检查):

int insert(int **array, int arraySize, int newElement)
{
  *array = realloc(*array, ++arraySize * sizeof(int));
  (*array)[arraySize - 1] = newElement;
  return arraySize;     // Return new Array size......
}

int arraySize = 5;
int *array = malloc(arraySize * sizeof(int));
for(int i = 0; i < arraySize; i++)
{
  array[i] = i + 1;
}

arraySize = insert(&array, arraySize, 6);

其次,目前还不清楚如何在不知道尺寸的情况下打印一般的工作方式。将数组传递给函数时,必须以约定的方式传递长度或终止数组(例如,使用NULL或0)。