【发布时间】:2021-10-14 05:10:54
【问题描述】:
我正在学习 C 语言中的指针。为了了解详细信息,我正在研究一个数组程序。我想要实现的是,如果数组的大小为 0(最初),则使用大小为 2 的 malloc 创建一个动态数组,然后在初始位置添加元素。
此外,当添加更多元素时,如果总元素 == 数组的大小,我使用 malloc 创建一个新数组,其大小是先前大小的两倍。我创建了一个临时数组,从前一个数组中复制元素,然后在最后添加新元素。问题是当我尝试打印元素时,我得到的是最后一个元素的地址而不是元素的地址。
这是完整的代码。
#include<stdio.h>
#include<stdlib.h>
void display(int *arr, int *total_elements)
{
if(*total_elements==0){
printf("No elements present in array\n");
return;
}
else
{
for(int i=0;i< *total_elements;i++){
printf("%d\t",*(arr+i));
}
}
}
void push(int *arr, int *size, int ele, int *total_elements)
{
if(*size==0)
{
*arr = (int*)malloc(2*sizeof(int));
arr[*size] = ele;
*total_elements = *total_elements + 1;
*size = *size + 2;
return;
}
else if(*size>*total_elements)
{
arr[*total_elements] = ele;
*total_elements = *total_elements + 1;
return;
}
else if(*size==*total_elements)
{
int *temp,i;
temp = (int*)malloc((*(size)*2)*sizeof(int));
for(i=0;i < *size;i++)
{
temp[i] = *(arr+i);
}
temp[i]=ele;
arr = temp;
*size = (*size)*2;
*total_elements = *total_elements + 1;
for(int i=0;i< *total_elements;i++){
printf("%d\t",*(arr+i));
}
}
}
void pop()
{
}
void main()
{
int select=0;
int *arr, size=0, total_elements = 0;
while(select!=4)
{
printf("\nSelect a number\n1. push\n2. pop\n3. display\n4. exit\n");
scanf("%d",&select);
switch (select)
{
case 1:
printf("Enter element to push: ");
int ele;
scanf("%d",&ele);
push(arr,&size,ele,&total_elements);
break;
case 3:
display(arr, &total_elements);
break;
case 4: break;
default:
break;
}
}
}
输入 3 个元素后(11,22,33)。 push 函数的打印输出。
11 22 33
显示函数的打印输出。
11 22 -1943936495
我确定在使用指针时推送函数有错误。为什么会这样?
【问题讨论】:
-
请注意,您的局部变量
arr未初始化。我建议初始化每个指针(例如到NULL)。您可能想要定义一个返回指针的grow函数并调用arr= grow(arr); -
@BasileStarynkevitch 是的,我会添加增长功能以便更好地理解
-
使用
realloc代替自制增长代码。 -
*arr = (int*)malloc(2*sizeof(int));是一个错误。如果您没有看到错误消息,请重新配置您的编译器设置。尝试运行存在编译时错误的程序完全是浪费时间。