我有以下程序:
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);
}
答案 0 :(得分:3)
你不能像这样扩展C数组的大小;在这方面它不是动态的;一点也不。您必须显式重新分配内存。由于存储器可以在C中以两种方式分配:堆栈(函数中的局部变量)和堆(调用malloc
),因此情况更加复杂。 (实际上我猜它是三种方式,如果你包括全局/静态。)
因此有两件事需要改变:
答案 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)。