yycyxl117 2023-02-25 22:57 采纳率: 50%
浏览 658
已结题

C语言出现报错 表达式必须是指向完整对象类型的指针

写下列代码时,出现了这个报错
E0852 表达式必须是指向完整对象类型的指针
是在函数最后一行那个destination++处出现的
请问这个报错是什么意思?

/*实现逆序的Memcpy方法。
函数原型: void * reversememcpy ( void * destination, const void * source, int num );
功能要求: 从source所指的内存地址的起始位置开始拷贝num个字节,按字节逆序保存到目标
            destination所指的内存地址的起始位置中。
返回值:为destination

注意:
1. 本函数实现的是按字节逆序拷贝。例如source指向位置,如果依次保存了'a','b','c','d',当num=4时,
    则逆序拷贝后destination指向的位置应该依次'd','c','b','a'.
2. 将源文件命名为functions.cpp。
3. 遇到异常情况,输出"error";否则不要随意输出,会视为错误。*/

#include<stdio.h>
void* reversememcpy(void* destination, const void* source, int num);
int main()
{
    int num;
    char destination[10];
    char source[10] = { "abcd" };
    reversememcpy(destination,source,num);
    for (int i = 0; destination[i] != ' '; i++) printf("%c", destination[i]);
    return 0;
}
void* reversememcpy(void* destination, const void* source, int num)
{
    if (destination == NULL || source == NULL) printf("error");
    else {
        int i;
        for (i = 0; (char)destination != ' ' && (char)destination != '\0'; i++)destination++;
        
    }
}

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-25 23:06
    关注

    基于Monster 组和GPT的调写:
    该报错意味着正在尝试对不完整的类型进行指针运算。这通常是由于尝试使用未定义的指针引用或未分配内存所致。在代码中,出现此错误是因为在函数 reversememcpy 的最后一行中对指针 destination 进行了递增运算,但该指针尚未指向完整的对象。

    要解决这个问题,需要确保 destination 指向一个完整的对象。在这种情况下,应该使用一个指向数组的指针,例如 char*,而不是 char[] 数组,以便可以对指针执行递增运算。还需要将指针初始化为有效的内存位置,例如:

    char* destination = new char[10];
    
    
    

    最后,确保在函数 reversememcpy 中完成所有的逆序拷贝操作,并将指针 destination 返回作为函数的返回值。

    
    
    void* reversememcpy(void* destination, const void* source, int num)
    {
        if (destination == NULL || source == NULL) {
            printf("error");
            return NULL;
        }
        else {
            char* dest = static_cast<char*>(destination);
            const char* src = static_cast<const char*>(source);
            dest += num - 1;
            for (int i = 0; i < num; i++) {
                *dest-- = *src++;
            }
            return destination;
        }
    }
    

    我还使用了 static_cast 将 void* 转换为 char* 和 const char*,以避免编译器警告。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏