首页 > 解决方案 > 如何更改数组的大小并插入另一个元素?

问题描述

我有一个数组 0 1 2 4 5 6 7 8 9。我想在 2 和 4 之间插入 3。

调用函数后长度保持不变,即使我添加了一个值,为什么?

printf("%d,", feld[9]);给我正确的价值,代码有效 - 但我收到警告。

即使我用int feld[9] = {0,1,2,4,5,6,7,8,9};or初始化,我如何插入一个值int feld[] = {0,1,2,4,5,6,7,8,9};


nt insertArray(int* array, int length, int value, int pos) 
{
    int i;

    if (pos < length)
    {
        for (i = length; i > pos; i--)
        {
            array[i] = array[i - 1];
        }
        array[i] = value;
        length++;
    }

    else if (pos == length)
    {
        array[pos] = value;
        length++;
    }
    return length;
}


int main()
{
    int feld[9] = {0,1,2,4,5,6,7,8,9};

    size_t length = sizeof(feld) / sizeof(int);

    insertArray(feld, length, 3, 3);

    length = sizeof(feld) / sizeof(int);

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

    printf("%d,", feld[9]);

    return 0;
}

标签: carraysmemoryinsert

解决方案


根据 C 语法,不允许在定义后修改静态分配数组的长度。任何这样做的尝试都会调用未定义的行为

相反,使用 分配动态内存malloc(),使用指针偏移来访问某些伪元素并使用realloc()来调整内存大小。

将元素的内容复制到元素4到。现在您可以存储在元素中。951034th

一个示范性例子:

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

#define SIZE 9
#define ELEM_TO_CH 4

int main(void)
{
    int* feld_ptr = malloc(sizeof(int) * SIZE);
    if(!feld_ptr)
    {
       fprintf(stderr,"Memory could not be allocated for feld_ptr!");
       return 1;
    }

    for(int i = 0; i < SIZE; i++)
    {
       if (i > (ELEM_TO_CH - 2))
          feld_ptr[i] = i + 1;
       else
          feld_ptr[i] = i;
    }

    printf("Before:\n\n");
    for(int i = 0; i < SIZE; i++)
    {
       printf("feld_ptr[%d] = %d\n", i, feld_ptr[i]);
    }

    printf("\n\n");

    feld_ptr = realloc(feld_ptr, SIZE + 1);
    if(!feld_ptr)
    {
       fprintf(stderr,"Error at resizing memory pointed by feld_ptr!");
       return 1;
    }

    memcpy(&feld_ptr[ELEM_TO_CH], &feld_ptr[ELEM_TO_CH-1], sizeof(int) * ((SIZE + 1) - ELEM_TO_CH));

    feld_ptr[ELEM_TO_CH-1] = 3;

    printf("After:\n\n");
    for(int i = 0; i < (SIZE + 1); i++)
    {
        printf("feld_ptr[%d] = %d\n", i, feld_ptr[i]);
    }

    free(feld_ptr);

    return 0;
}

输出:

Before:

feld_ptr[0] = 0
feld_ptr[1] = 1
feld_ptr[2] = 2
feld_ptr[3] = 4
feld_ptr[4] = 5
feld_ptr[5] = 6
feld_ptr[6] = 7
feld_ptr[7] = 8
feld_ptr[8] = 9

After:

feld_ptr[0] = 0
feld_ptr[1] = 1
feld_ptr[2] = 2
feld_ptr[3] = 3
feld_ptr[4] = 4
feld_ptr[5] = 5
feld_ptr[6] = 6
feld_ptr[7] = 7
feld_ptr[8] = 8
feld_ptr[9] = 9

推荐阅读