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

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 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来