在函数中使用 realloc() 调整 int 指针大小时出现问题
Problems when using realloc() in a function to resize the int pointer
我想先做一个大小为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;
}
}
你的指针a是函数add的参数。参数只是该函数中的局部变量,因此当您分配 a = realloc (...) 时,调用函数中的 a 不会更改。这将很快崩溃。大小也未调整 - 如果您在索引 17 处添加一个元素,然后在索引 12 处添加元素,则您的数组将调整为 13 个元素。
您可以使用BLUEPIXY的解决方案。我更喜欢创建一个包含指针和大小的结构,然后传递它并让代码更新它。避免很多**;它们对你的大脑不好:-)
您必须将 int * a 参数更改为 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;
}
Malloc 和 realloc 应该针对 (int) 的大小而不是 (int*) 的大小来完成
我想先做一个大小为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;
}
}
你的指针a是函数add的参数。参数只是该函数中的局部变量,因此当您分配 a = realloc (...) 时,调用函数中的 a 不会更改。这将很快崩溃。大小也未调整 - 如果您在索引 17 处添加一个元素,然后在索引 12 处添加元素,则您的数组将调整为 13 个元素。
您可以使用BLUEPIXY的解决方案。我更喜欢创建一个包含指针和大小的结构,然后传递它并让代码更新它。避免很多**;它们对你的大脑不好:-)
您必须将 int * a 参数更改为 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;
}
Malloc 和 realloc 应该针对 (int) 的大小而不是 (int*) 的大小来完成