C语言 为什么数组的最后一个元素不见了?

unftdfkk  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(125)

我在C中定义了一个数组。我想实现一个代码,我可以在数组中间插入一个新值(数组中除了第一个和最后一个位置之外的任何位置)。因此,我写了一个函数,它将接受三个参数-数组,我想放置新值的位置,和将要插入位置的值。但是当我执行程序时,最后一个元素丢失了,它显示的是最后一个值5,但是在旧数组中,最后一个元素不是5。你能告诉我我哪里做错了吗?

#include <stdio.h>

void resize(int arr[], int position, int value);

int main(void)
{
    int arr[] = { 10, 20, 60, 80, 10 };
    resize(arr, 3, 90);

    for (int i = 0; i < 6; i++)
    {
        printf("%d\n", arr[i]);
    }
}

void resize(int arr[], int position, int value)
{
    for (int i = 5; i >= position; i--)
    {
        arr[i] = arr[i - 1];
    }
    arr[position - 1] = value;
}

字符串

of1yzvn4

of1yzvn41#

已定义的数组不能 * 调整大小 *。已分配的数组可以重新分配。您的函数resize具有未定义的行为,因为它将arr[4]存储到arr[5]中,这超出了数组的结尾。
下面是重新分配数组的修改版本:

#include <stdio.h>
#include <stdlib.h>

int resize(int **arrp, size_t *countp, size_t position, int value);

int main(void)
{
    size_t count = 5;
    int *arr = malloc(sizeof(*arr) * count);
    if (arr == NULL) {
        printf("cannot allocate array\n");
        return 1;
    }
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 60;
    arr[3] = 80;
    arr[4] = 10;

    if (resize(&arr, &count, 3, 90) < 0) {
        printf("cannot resize array\n");
        free(arr);
        return 1;
    }

    for (size_t i = 0; i < count; i++) {
        printf(" %d", arr[i]);
    }
    printf("\n");
    free(arr);
    return 0;
}

int resize(int **arrp, size_t *countp, size_t position, int value)
{
    size_t count = *countp;
    if (position > count)
        return -1;
    int *newarr = realloc(*arrp, sizeof(*newarr) * (count + 1));
    if (newarr == NULL)
        return -1;
    *arrp = newarr;
    *countp = count + 1;
    for (size_t i = count; i > position; i--) {
        newarr[i] = newarr[i - 1];
    }
    newarr[position] = value;
    return 0;
}

字符串
输出量:

10 20 60 90 80 10

jdgnovmf

jdgnovmf2#

我已经更新了以前的代码,现在它可以添加一个值到数组中所需的位置。

#include<stdio.h>
#include<stdlib.h>

int resize(int arr[], int array_size, int position, int value);
int main(void)
{

字符串
//通过从用户获取输入来初始化数组的大小

int array_size;
    printf("Enter array size: ");
    scanf("%d", &array_size);


//为数组分配空间

int *arr = malloc(sizeof(int) * array_size);
    if (arr == NULL)
    {
        return 1;
    }


//对数组取值

int i = 0;
    do
    {
        printf("enter: ");
        scanf("%d", (arr + i));
        i++;
    }
    while (i < array_size);


//打印当前数组

printf("old array: ");
    for(int j = 0; j < array_size; j++)
    {
        printf("%d, ", arr[j]);
    }
    printf("\n");


//获取位置输入

int position, value;
    printf("position: ");
    scanf("%d", &position);


//获取值

printf("value: ");
    scanf("%d", &value);


//将数组大小递增到新的大小

array_size++;


//创建数组

resize(arr, array_size, position, value);


//打印调整大小的数组

printf("new array: ");
    for (int i = 0; i < array_size; i++)
    {
        printf("%d, ", arr[i]);
    }
}    

int resize(int arr[], int array_size, int position, int value)

{


//在不同的整数指针中为新值分配空间

int *arr1 = malloc(sizeof(int) * array_size);
    if (arr1 == NULL)
    {
        printf("error\n");
    }


//初始化arr 1中的所有值都与arr 2相同

arr1 = arr;

    if (position == array_size)
    {
        arr1[position - 1] = value;
        arr = arr1;
        return 0;
    }


//在新数组中将数组元素移位1;这是ex:第4个位置的元素现在在第5个位置

else
    {
        for (int i = array_size - 1; i >= position; i--)
        {
            arr1[i] = arr[i - 1];
        }


//将值插入位置,位置为position - 1 index

arr1[position - 1] = value;


//现在再次将新的arr 1指向新的内存,所以新的内存指向新的更新内存

arr = arr1;
        return 0;
    }
}

相关问题