数组相关问题
Posted
技术标签:
【中文标题】数组相关问题【英文标题】:Array Related Question 【发布时间】:2010-06-13 15:10:10 【问题描述】:我有以下程序:
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);
【问题讨论】:
什么?谁告诉你你可以像这样在 C 中改变数组的大小! 那么,如何在数组的最后一个位置插入一个元素...... 我怀疑你的背景是 php 或类似的环境。在 C 中,数组大小在声明后是固定的...... C 中有没有一个叫做 print 的函数??不是 printf 吗? 是的,数组在被调用后的大小是不变的……而且,你写的函数和你调用的函数不一样,所以我想知道为什么你的文件甚至被编译了。假设您费心运行此代码,此时似乎值得怀疑。 【参考方案1】:你不能像这样扩展 C 数组的大小;在这方面它不是动态的;一点也不。您必须显式地重新分配内存。由于在 C 中可以通过两种方式分配内存,情况变得更加复杂:从堆栈(函数中的局部变量)和从堆(调用malloc
)。 (实际上我猜这是三种方式,如果你包括全局/静态。)
因此有两点需要改变:
-
如果您只想使用简单数组,而不是包含数组和一些大小指示的结构,您的“插入”函数将必须分配新内存并将旧数组值复制到其中
应从堆中分配要由该函数操作的数组。
【讨论】:
【参考方案2】:首先,这会导致缓冲区溢出(两个):
您已为 5 个整数(最后一个索引 4)分配空间。那么:
array[arraySize + 1] = newElement;
写入索引 6,即数组末尾 两个。如果要更改数组的大小,则需要使用 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)。
【讨论】:
ohh....这只是为了表明数组打印的逻辑在这里工作......我如何在数组的最后一个位置添加一个新元素,通过一个函数………… 如何在数组中插入元素.....在这一行之后...... int *array = malloc(arraySize * sizeof(int)); 我认为使用对指针的引用而不是使用指向指针的指针更好......尤其是对于新手...... @AGeek,我添加了初始化。 @Beta,阅读问题。 C 没有引用。 仍然无法正常工作.......运行时错误............ ***检测到 glibc *** ./a.out: realloc(): invalid下一个尺寸:0x09c44008 ***我不知道这个错误............以上是关于数组相关问题的主要内容,如果未能解决你的问题,请参考以下文章