我想首先制作一个大小为10的int*
并编写一个add()
函数来添加元素。如果元素数量大于10,则函数将使用realloc()
来调整int*
的大小。但是我收到了错误消息。我怎样才能改善这个?
这是我做的:
int main()
{
int size = 10;
int* a;
a = (int*)malloc(size*sizeof(int*));
int i;
double start, stop;
start = clock();
for (i = 0; i < 100000; i++){
add(&a, i, size, i);
}
stop = clock();
printf("Adding arry by one: %10.2f\n", stop - start);
return 0;
}
void add(int *a, int element, int size, int index)
{
if (index < size)
{
a[index] = element;
}
else if (index >= size)
{
a = realloc(a, sizeof(int*)*(index + 1));
a[index] = element;
}
}
答案 0 :(得分:2)
指针a是函数add的参数。参数只是该函数中的局部变量,因此当您指定= realloc(...)时,调用函数中的a不会被更改。这会很快崩溃。大小也没有调整 - 如果你在索引17处添加一个元素,然后索引12,你的数组将被调整为13个元素。
您可以使用BLUEPIXY的解决方案。我更喜欢创建一个包含指针和大小的结构,然后传递它并让代码更新它。避免许多**;它们对你的大脑不利: - )
答案 1 :(得分:0)
您必须将int *参数更改为int ** a。我对结构做了一些改动:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define SIZE 10
void add(int**a, int element, int size, int index) {
if (index >= size) {
*a = realloc(*a, sizeof(int)*(index + 1));
}
(*a)[index] = element;
}
int main() {
int *a = malloc(SIZE*sizeof(int));
double start, stop;
start = clock();
for (int i = 0; i < 100000; i++) {
add(&a, i, SIZE, i);
}
stop = clock();
printf("Adding arry by one: %10.2f\n", stop - start);
free(a);
return 0;
}
答案 2 :(得分:0)
对于(int)的大小,应该完成malloc和realloc而不是(int *)的大小