c - 如何更改数组的大小并插入另一个元素?
问题描述
我有一个数组 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;
}
解决方案
根据 C 语法,不允许在定义后修改静态分配数组的长度。任何这样做的尝试都会调用未定义的行为。
相反,使用 分配动态内存malloc()
,使用指针偏移来访问某些伪元素并使用realloc()
来调整内存大小。
将元素的内容复制到元素4
到。现在您可以存储在元素中。9
5
10
3
4th
一个示范性例子:
#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
推荐阅读
- xamarin.forms - 如何在 Xamarin.Forms 中以编程方式模拟或触发 Enter 或 Return 键
- rest - Rest:一个资源是否可以包含另一个资源的属性
- c++ - 不使用交换的单链表中的选择排序
- java - 嵌套循环的时间和空间复杂度
- web - 您如何将 jekyll 站点内容和代码分离到单独的分支中?
- javascript - 无法对齐网格项目之间的分隔线
- python - 无法将数据框的 html 内容转换为文本
- excel - 从 Excel 中的两个单元格获取 Outlook 约会的开始日期和开始时间
- postgresql - 使用 docker 的 Hasura 安装问题 - PostgreSQL 没有响应
- javascript - 如何使用 JavaScript 显示“倒计时”?