【发布时间】:2021-02-15 07:48:27
【问题描述】:
我调用一个函数来交换内存中的消息:
for (int i = now->size - 1; i >= 0; i--)
{
void *address2 = prev->start_address + i;
void *address1 = now->start_adress + i;
address1 = address2;
address2 = '\0';
}
所以基本上我有两个地址,一个指向第一个起始位置,另一个指向必须粘贴内容的第二个起始位置。
问题是我找到的唯一解决方案是添加int(这是i 值)和prev->start_adress(即void*),正如我所展示的。我想正确地做到这一点,我无法将 void 指针更改为 int。有没有其他可能。
我的错误:
error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arit]
214 | void *address2 = prev->start + i;
Warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arit]
215 | void *address1 = now->start + i;
支持信息: 我有一个链表(充满了段描述符)和一个“内存”,它是一个简单的数组 []。类似于 malloc 的工作原理。
typedef struct segmentdescriptor
{
Byte allocated;
void *start;
size_t size;
struct segmentdescriptor *next;
} Node;
开始指针指向数组[]中分配空间的开始。
更新: 最简单的方法是使用类型转换对 void 指针进行算术运算,如果您知道它们的大小,例如:
char *address2 = (char *)prev->start + i;
如果你不知道类型,那是不可能的,例如:
char *pointer 指向一个字节的内存,如果你写 pointer++ 去
到下一个字节。 int *pointer 可以说是四个再见。如果你写pointer ++ 则转到四个字节之后的四个字节。
下面也有很好的答案。 谢谢大家的回答。
【问题讨论】:
-
你不能对 void * 进行算术运算。它怎么知道要加多少?
-
“我无法将 void 指针更改为 int”为什么?您应该能够将其转换为
int(或任何其他能够保存指针而不会丢失数据的整数数据类型),然后将其转换回void* -
start_adress 指向内存中第一个需要复制的地址
-
通常的解决方案是将
void*转换为char*。 -
void *address1 = now->start_adress + i;但是你在下一个赋值address1 = address2;中丢弃了赋值,而address2 = '\0';它建议你打算将一个char 值赋给一个指针变量。我认为您错过了一些取消引用运算符。您是否考虑过使用memcpy或memmove?
标签: c pointers memory-address