1. 动态申请一个具有10个float类型元素的内存空间,从一个已有的数组中拷贝数据,并找出第一次出现 12.35 的下标位置,并输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// 动态申请10个float类型元素的内存空间
float *a = (float*)malloc(10 * sizeof(float));
if (a == NULL)
{
printf("内存分配失败\n");
return 1;
}
// 已有数组
float originalArray[10] = {1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 12.35};
// 拷贝数据
memcpy(a, originalArray, 10 * sizeof(float));
// 查找第一次出现12.35的下标
int index = -1;
for (int i = 0; i < 10; i++)
{
if (a[i] == 12.35f)
{
index = i;
break;
}
}
// 输出结果
if (index != -1)
{
printf("第一次出现12.35的下标是: %d\n", index);
}
else
{
printf("未找到12.35\n");
}
// 释放内存
free(a);
return 0;
}
2. 动态申请一个整型数组,并给每个元素赋值,要求删除第3个元素。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 5; // 数组初始大小
// 动态申请整型数组
int *a = (int*)malloc(n * sizeof(int));
if (a == NULL)
{
printf("内存分配失败\n");
return 1;
}
// 给每个元素赋值
for (int i = 0; i < n; i++)
{
a[i] = i;
}
// 输出原始数组
printf("原始数组: ");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
// 删除第3个元素,移动元素覆盖要删除的元素
for (int i = 2; i < n - 1; i++)
{
a[i] = a[i + 1];
}
// 重新分配内存
n--;
int *temp = (int*)realloc(a, n * sizeof(int));
if (temp == NULL)
{
printf("内存重分配失败\n");
free(a);
return 1;
}
a = temp;
// 输出删除后的数组
printf("删除第3个元素后的数组: ");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
// 释放内存
free(a);
return 0;
}
3. 动态申请一个整型数组,并给每个元素赋值,要求在第4个元素后插入100。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 5; // 数组初始大小
// 动态申请整型数组
int *a = (int*)malloc(n * sizeof(int));
if (a == NULL)
{
printf("内存分配失败\n");
return 1;
}
// 给每个元素赋值
for (int i = 0; i < n; i++)
{
a[i] = i;
}
// 输出原始数组
printf("原始数组: ");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
// 在第4个元素后插入10086,重新分配内存
n++;
int *temp = (int*)realloc(a, n * sizeof(int));
if (temp == NULL)
{
printf("内存重分配失败\n");
free(a);
return 1;
}
a = temp;
// 移动元素,为插入新元素腾出空间
for (int i = n - 1; i > 4; i--)
{
a[i] = a[i - 1];
}
// 插入新元素
a[4] = 100;
// 输出插入后的数组
printf("插入100后的数组: ");
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
// 释放内存
free(a);
return 0;
}
4. 编写一个函数,实现 memmove 的功能。
#include <stddef.h>
void *my_memmove(void *dest, const void *src, size_t n) {
if (dest == NULL || src == NULL || n == 0) {
return dest;
}
unsigned char *d = (unsigned char *)dest;
const unsigned char *s = (const unsigned char *)src;
if (d < s) {
for (size_t i = 0; i < n; i++) {
d[i] = s[i];
}
} else {
for (size_t i = n; i > 0; i--) {
d[i - 1] = s[i - 1];
}
}
return dest;
}