我已经用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;
}

推荐答案

定义的数组不能为resized.可以重新分配已分配的array.您的函数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

C++相关问答推荐

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

在Windows上构建无聊的SSL x64

ATTiny1606定时器TCA 0中断未触发

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

C语言中的strstr问题

在C++中头文件中声明外部 struct

C-使用指针返回修改后的整数数组

判断X宏的空性

GTK函数调用将完全不相关的char* 值搞乱

仅从限制指针参数声明推断非混叠

为什么这个分配做得不好呢?

为什么编译器不能简单地将数据从EDI转移到EAX?

C++中PUTS函数的返回值

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

如何修复我的qsort()算法?它每次都给出不同的结果

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

强制GCC始终加载常量(即只读),即使启用了优化

如何不断地用C读取文件?

在 C/C++ 中原子按位与字节的最佳方法?